Android: ускорение загрузки нескольких небольших файлов

Я надеюсь на некоторые советы о том, как ускорить загрузку нескольких небольших файлов в моем приложении. Приложение скачивает 300-400 небольших (15 КБ) файлов. Несмотря на то, что общий размер невелик, загрузка занимает много времени из-за дополнительного времени рукопожатия для каждого отдельного файла.

Я попытался заархивировать файл, загрузить его и разархивировать на устройстве, но в итоге это оказалось медленнее, чем простая загрузка их всех напрямую (хотя это могло быть связано с неэффективным алгоритмом распаковки..)

Может ли кто-нибудь дать совет о том, как ускорить загрузку (возможно, запросив загрузку 3 за раз, а не последовательно?) или иметь эффективный фрагмент кода для распаковки, которым они не против поделиться, он будет признателен!


person Nedlinin    schedule 18.01.2012    source источник


Ответы (5)


Несмотря на то, что общий размер невелик, загрузка занимает много времени из-за дополнительного времени рукопожатия для каждого отдельного файла.

Я не совсем уверен, как вы пришли к такому решению. Если это было через Traceview, отлично. Если нет, рассмотрите возможность использования Traceview, чтобы определить, где именно происходит замедление.

Кроме того, я не совсем уверен, что вы подразумеваете под «временем рукопожатия». Если вы имеете в виду создание и разрыв соединений сокетов, и HttpUrlConnection, и HttpClient должны поддерживать поддержку активности. В первом есть ошибка в Android 2.1 и более ранних версиях; последний требует, чтобы вы повторно использовали свой экземпляр HttpClient.

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

Однако, опять же, используйте Traceview, чтобы определить, в чем заключается ваша настоящая проблема.

person CommonsWare    schedule 18.01.2012
comment
В настоящее время я просто использую UrlConnection. Похоже, что если я переключусь на HttpUrlConnection, время поддержания активности будет очень полезным. Я проверю это позже сегодня вечером. Ценить это! - person Nedlinin; 18.01.2012

Браузеры справляются с этим, запуская несколько потоков для параллельной загрузки ресурсов. Как могут потоки? Хороший вопрос. Я не уверен, может быть, вы можете использовать какую-то эвристику, основанную на скорости процессора, количестве ядер и типе интернет-соединения - 2G, 3G, 4G и т. д. У вас может быть пул потоков с таким количеством рабочих потоков, которые загружали эти файлы, гарантирующие, что вы никогда не превысите заданное количество потоков.

Последовательная загрузка файлов определенно не кажется правильным способом. AsyncTask идеальный кандидат на такую ​​работу. Если вы не знаете, как это использовать, вы можете увидеть это.

person Code Poet    schedule 18.01.2012
comment
На самом деле я уже использую AsyncTask для загрузки в фоновом режиме. Однако я вызываю одну AsyncTask, которая загружает файлы последовательно. Итак, вы рекомендуете создать несколько AsyncTask для одновременной загрузки нескольких файлов? - person Nedlinin; 18.01.2012

Я думаю, что лучше всего использовать механизм кэширования (при условии, что эти файлы будут загружены несколько раз). Если вам нужно загружать эти файлы по отдельности, то да, для каждого файла всегда будет делаться отдельный запрос, и это займет столько времени, сколько это должно зависеть от вашего сервера/соединения и т. д.

Если пользователю придется загружать эти файлы более одного раза, лучше всего будет кэшировать эти файлы. http://developer.android.com/guide/topics/data/data-storage.html

person volk    schedule 18.01.2012

Взгляните на этот интересный пост в блоге разработчиков Android: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

В Gingerbread мы добавили прозрачное сжатие ответов. HttpURLConnection автоматически добавит этот заголовок к исходящим запросам и обработает соответствующий ответ:

Accept-Encoding: gzip

Воспользуйтесь этим, настроив веб-сервер на сжатие ответов для клиентов, которые могут его поддерживать.

[...]

Для Gingerbread и выше лучше всего подходит HttpURLConnection. Благодаря простому API и небольшому размеру он отлично подходит для Android. Прозрачное сжатие и кэширование ответов сокращают использование сети, повышают скорость и экономят заряд батареи. Новые приложения должны использовать HttpURLConnection; [...]

person Francesco Vadicamo    schedule 18.01.2012

Вы сами генерируете 300-400 файлов? Тогда вы могли бы сделать, может быть, 6 файлов размером от 0,7 до 1 МБ каждый. Загрузите их на свое устройство. Затем разделите их на специальную строку. Эта строка также должна использоваться при добавлении файлов в большой.

File1.txt: это содержимое файла 1!

File2.txt: Вот и я ;-)

Разделитель: {%~

Сгенерированный файл должен выглядеть так: File1.txt: Это содержимое файла 1!{%~File2.txt: Вот я ;-)

На устройстве вы ищете "{%~" и разделяете там.

Или вы можете использовать Threads для одновременной загрузки большего количества файлов.

person PKeidel    schedule 18.01.2012
comment
Я должен был указать, что я не создаю эти файлы сам. Просто потянув их с сервера. - person Nedlinin; 18.01.2012