0

У меня есть ListView в моем приложении, что каждой строке ListView потребуется загрузить несколько изображений из удаленных ресурсов. (То есть listview выглядит примерно так, как Instagram, где каждый элемент содержит хотя бы одно изображение) ,Ждите ожидающих AsyncTask в android

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

  1. Мой первый кэш-памяти уровня определяется следующим образом:

    private Map<String, SoftReference<Bitmap>> l1ImageCache = new HashMap<String, SoftReference<Bitmap>>();
    , что я мог бы сохранить некоторые SoftReference из изображение в памяти, чтобы ускорить поиск приложения.

  2. Мой кэш второго уровня - это папка на SD-карте или в памяти телефона. Где я храню некоторые из моих уже загруженных изображений. Если приложение не может найти изображение в кеше памяти, оно появится в каталоге файлов. Если файл изображения существует, он будет загружать файл локально и также помещать ссылку на файл в кеш памяти.

  3. Если приложение не может найти нужное изображение из кеша или кеша памяти, оно будет использовать ImageDownloadWorker (extends AsyncTask), чтобы запустить поток и загрузить изображение. Тем не менее, андроид может разрешать до 128 потоков на одно приложение, я думаю, способ сохранить некоторые потоки. Я создал эту структуру данных:

    // keep all pending downloads
    private HashMap<String, ImageDownloadWorker> downloadTaskMap = new HashMap<String, ImageDownloadWorker>();
    В каком поле строки будет URL для загрузки. Это проверка того, что поток для загрузки определенного URL-адреса уже запущен, поэтому мне не нужно запускать другой поток для загрузки того же самого.

Мой вопрос Согласно кодексу, предположим, один случай, что приложение собирается загрузить изображение. Изображение не находится ни в кеше памяти, ни в папке загруженных файлов. Таким образом, приложение проверило downloadTaskMap, если уже есть поток, загружающий этот файл, так что ему не нужно создавать новую AsyncTask для одной и той же вещи. BUT Как я могу знать, закончилась или нет незавершенная задача загрузки, не блокируя основной поток? Если я делаю что-то вроде wait/notify или некоторого бесконечного цикла while, мне было интересно, что это заблокирует поток пользовательского интерфейса?

Указатели приветствуются, спасибо!

ответ

0

Прежде всего вам не нужно писать все это самостоятельно, существует множество решений для ленивой загрузки изображений, доступных для Android. См. here, или даже лучше here.

Что касается задач асинхронных - они не будут работать одновременную установка, вы должны использовать либо обычный Thread или executeOnExecutor в качестве последнего обновления this answer предлагаете (в противном случае вы не получите параллелизм на новых устройствах). Кстати, я думаю, что вы найдете этот ответ полезным более чем одним способом.

Смежные вопросы