【发布时间】:2013-11-11 17:27:14
【问题描述】:
我的应用程序中有一个ListView,ListView 的每一行都需要从远程资源加载多个图像。(即列表视图看起来像 Instagram,其中每个项目至少包含一个图像)。
我正在实现两级缓存以改善加载图像体验:
-
我的一级内存缓存是这样定义的:
private Map<String, SoftReference<Bitmap>> l1ImageCache = new HashMap<String, SoftReference<Bitmap>>();
我可以在内存中保留一些图像的 SoftReference 以加快应用查找速度。 我的二级文件缓存是 SD 卡或手机存储上的文件夹。我在那里保存了一些我已经下载的图像。如果应用程序在内存缓存中找不到图像,它将在文件目录中查找。如果图像文件存在,它会在本地加载文件并将文件引用放入内存缓存中。
-
如果应用无法从内存缓存或文件缓存中找到所需的图像,它将使用
ImageDownloadWorker(扩展AsyncTask)启动线程并下载图像。但是,android 每个应用程序最多只能允许 128 个线程,我正在考虑一种节省一些线程的方法。我创建了这个数据结构:// keep all pending downloadsprivate HashMap<String, ImageDownloadWorker> downloadTaskMap = new HashMap<String, ImageDownloadWorker>();
其中的字符串字段将是要下载的 URL。这是为了检查下载某个 URL 的线程是否已经在运行,所以我不必启动另一个线程来下载相同的东西。
我的问题是根据代码,假设应用程序即将下载图像的情况。图像既不在内存缓存中,也不在下载的文件夹中。所以应用程序检查了downloadTaskMap,如果已经有一个线程正在下载这个文件,那么它就不必为同一件事创建一个新的 AsyncTask。 但是我如何知道这个挂起的下载任务何时完成而不阻塞主线程?如果我执行诸如等待/通知或无限循环之类的操作,我想知道这会阻塞 UI 线程吗?
欢迎指点,谢谢!
【问题讨论】:
标签: java android multithreading android-listview android-asynctask