Каковы оптимальные методы для быстрого ввода-вывода на медленных соединениях?

1

У меня есть мобильное приложение, которое хорошо управляется данными, но только через текст и изображения. В текущей версии каждый щелчок или касание требует вытащить новые данные с сервера (appache/php). При сетевой задержке это может занять 1-2 секунды, пока не появится первый контент, который слишком длинный.

Я слышал и рассматривал следующие варианты, но не уверен, что некоторые из них могут быть результативными или если я оставил что-то важное?

  • Загрузите все данные с самого начала, в большой группе с экраном загрузки?
  • Запустить поток предварительной загрузки, предсказать и загрузить данные, которые пользователь может захотеть, в фоновом режиме?
  • Всегда держите соединение открытым на сервере?
  • Загружать различные части данных в разные соединения параллельно? (Подобно facebook)
  • Использовать сжатие тяжелых данных?

Обстоятельная статья по этому вопросу также будет хорошим ответом.

Теги:
iphone
caching
networking
mobile

1 ответ

4
Лучший ответ

Я бы сказал, что большинство из этих предложений... довольно среднее. За исключением использования сжатия. Определенно включите сжатие на веб-сервере, который вы используете. Вы определенно не хотите сохранить соединение открытым или иметь несколько соединений. Самая большая проблема для мобильных устройств - латентность, а не пропускная способность, поэтому использование нескольких соединений не поможет, но быстро разрядит аккумулятор. Что касается того, что соединение открыто, даже не думайте об этом. Это один из самых больших постулатов мобильной разработки - только держите соединение открытым, когда оно вам нужно.

Эмпирическое правило для мобильных тонких клиентов - загрузить наименьшее количество данных, если это необходимо. Вот несколько советов:

  • Не отправляйте много метаданных с вашими данными. В случае JSON подумайте об изменении структуры, чтобы вы не отправляли имена полей для каждой записи. Возьмите ниже JSON, например:
{
 success: true,
 data:[
   {ProductName: "Coca-Cola can", Weight: 380, imageUrl: "http://path.to/image.png"},
   {ProductName: "Gillete deodarant", Weight: 500, imageUrl: "http://path.to/image.png"}
 ]
}

Как вы можете видеть, существует много дублированных имен полей, вы можете избавиться от них, чтобы уменьшить полезную нагрузку следующим образом:

{
 success: true,
 fields: {"ProductName": 0, "Weight" : 1, "imageUrl": 2}
 data:[
   ["Coca-Cola can", 380, "http://path.to/image.png"],
   ["Gillete deodarant", 500, "http://path.to/image.png"]
 ]
}
  • Уменьшить количество данных, отправляемых каждый раз. Не отправляйте достаточно данных на 10 экранов одновременно. Обеспечьте, возможно, два или три экрана и используйте бесконечную прокрутку или какой-то пейджинг.

  • Исследуйте кеширование HTTP. Убедитесь, что заголовки кеширования установлены и убедитесь, что веб-клиент, которым вы пользуетесь, уважает эти заголовки.

  • Кэш агрессивно. Посмотрите на любой клиент Twitter для iPhone/Android. Они не загружают всю массу видимых твитов при каждом запуске, они хранятся локально.

  • 0
    Спасибо за отличный ответ! Могу я спросить вас, почему держать соединение открытым - это плохо, если «самая большая проблема для мобильных устройств - это задержка, а не пропускная способность»? Я также хотел бы погрузиться в код твиттера-дроида. Я посмотрю, смогу ли я найти это где-нибудь.
  • 0
    Поскольку открытые соединения разряжают батарею очень быстро. Независимо от того, сколько соединений вы открываете, у вас все равно будут проблемы с задержкой.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню