Android быстрая загрузка растровых изображений - PullRequest
7 голосов
/ 17 февраля 2012

У меня есть блок изображений, которые я хочу загрузить на свой экран.Все изображения - это файлы, которые я скачал и сохранил на SD-карте.

До сих пор я нашел два способа сделать это, во-первых, это загрузить их в основной поток, когда начинается действие (я получил70 изображений, и мне требуется около 2,1 секунды, чтобы загрузить их все).

Другой способ - это то, что я сейчас тестирую.Загрузите их в отдельном потоке, поэтому я покажу анимацию загрузки для пользователя.На данный момент моя реализация с ThreadPoolExecutor заняла 4,3 сек.Я сделал это на 10 потоках.

И последний метод (это единственное, что я еще не тестировал) - это работа со спрайтовым листом.

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

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

Ответы [ 4 ]

9 голосов
/ 20 февраля 2012
  1. Не загружать в основной поток. С задержкой в ​​2,1 секунды вы близки к тому, чтобы быть убитым с ошибкой ANR (приложение не отвечает), если вы заблокируете основной поток.

  2. Загрузка в отдельном потоке. Не создавайте 10 потоков, а один AsyncTask , и загружайте все свои изображения один за другим в doInBackground .

    Загрузка в AsyncTask должна занять (почти) то же время, что и загрузка в основном потоке. Не помещайте слишком много модной анимации, чтобы основной поток не занимал слишком много процессорного времени.

2 голосов
/ 23 февраля 2012

Одним из вариантов будет использование создания кэша изображений с использованием WeakReference, чтобы изображение было удалено из памяти, когда система сталкивается с ситуацией с нехваткой памяти. Таким образом, вы можете хранить изображения в памяти и загружать их с SDCard только тогда, когда их нет в памяти. Таким образом, ваша текущая активность всегда будет содержать жесткую ссылку на требуемое растровое изображение, а кэш изображений будет содержать слабую ссылку на растровое изображение.

Ниже приведена дополнительная информация о слабой ссылке:

JavaDoc слабая ссылка

Пост-обсуждение пост-потока с использованием слабой ссылки для кэша

0 голосов
/ 22 февраля 2012

Очевидно, что вы не должны оставлять операцию 2 с в потоке пользовательского интерфейса.

Я предполагаю, что ThreadPoolExecutor - это хорошее решение, но не оптимально создавать много потоков в вашем пуле. На фоне темы достаточно. Могу поспорить, у вас будет лучшая производительность, просто изменив это.

Я не рекомендую AsyncTask напрямую из Activity, потому что хрупок для изменения конфигурации .

Я не рекомендую работать со спрайтами. Увеличение размера одного изображения очень опасно на мобильном телефоне, где память ограничена. В частности, для спрайтов вам нужно получить части Bitmap, следовательно, на мгновение у вас будет полное растровое изображение.

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

0 голосов
/ 22 февраля 2012

Один из способов сделать это - реализовать своего рода слушателя / наблюдателя.

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

Вместо задачи Android-асинхронности я пойду за своими потоками (пул / Исполнители). Я получу все возможные пути к изображениям перед их загрузкой и отправкой в ​​поток, загружающий изображение. И при обратном вызове я знаю, где обновить изображение.

Кроме того, вы также можете проверить, как работает Loader в вашем случае.

...