У меня есть ListView
в моем приложении, что каждой строке ListView
потребуется загрузить несколько изображений из удаленных ресурсов. (То есть listview выглядит примерно так, как Instagram, где каждый элемент содержит хотя бы одно изображение) ,Ждите ожидающих AsyncTask в android
Я реализую кэш два уровня, чтобы улучшить опыт загрузки изображения:
Мой первый кэш-памяти уровня определяется следующим образом:
private Map<String, SoftReference<Bitmap>> l1ImageCache = new HashMap<String, SoftReference<Bitmap>>();
, что я мог бы сохранить некоторые SoftReference из изображение в памяти, чтобы ускорить поиск приложения.Мой кэш второго уровня - это папка на SD-карте или в памяти телефона. Где я храню некоторые из моих уже загруженных изображений. Если приложение не может найти изображение в кеше памяти, оно появится в каталоге файлов. Если файл изображения существует, он будет загружать файл локально и также помещать ссылку на файл в кеш памяти.
Если приложение не может найти нужное изображение из кеша или кеша памяти, оно будет использовать
ImageDownloadWorker
(extendsAsyncTask
), чтобы запустить поток и загрузить изображение. Тем не менее, андроид может разрешать до 128 потоков на одно приложение, я думаю, способ сохранить некоторые потоки. Я создал эту структуру данных:// keep all pending downloads
private HashMap<String, ImageDownloadWorker> downloadTaskMap = new HashMap<String, ImageDownloadWorker>();
В каком поле строки будет URL для загрузки. Это проверка того, что поток для загрузки определенного URL-адреса уже запущен, поэтому мне не нужно запускать другой поток для загрузки того же самого.
Мой вопрос Согласно кодексу, предположим, один случай, что приложение собирается загрузить изображение. Изображение не находится ни в кеше памяти, ни в папке загруженных файлов. Таким образом, приложение проверило downloadTaskMap
, если уже есть поток, загружающий этот файл, так что ему не нужно создавать новую AsyncTask для одной и той же вещи. BUT Как я могу знать, закончилась или нет незавершенная задача загрузки, не блокируя основной поток? Если я делаю что-то вроде wait/notify или некоторого бесконечного цикла while, мне было интересно, что это заблокирует поток пользовательского интерфейса?
Указатели приветствуются, спасибо!