【问题标题】:Wait for pending AsyncTask in android在android中等待挂起的AsyncTask
【发布时间】:2013-11-11 17:27:14
【问题描述】:

我的应用程序中有一个ListViewListView 的每一行都需要从远程资源加载多个图像。(即列表视图看起来像 Instagram,其中每个项目至少包含一个图像)。

我正在实现两级缓存以改善加载图像体验:

  1. 我的一级内存缓存是这样定义的:

    private Map<String, SoftReference<Bitmap>> l1ImageCache = new HashMap<String, SoftReference<Bitmap>>();
    我可以在内存中保留一些图像的 SoftReference 以加快应用查找速度。

  2. 我的二级文件缓存是 SD 卡或手机存储上的文件夹。我在那里保存了一些我已经下载的图像。如果应用程序在内存缓存中找不到图像,它将在文件目录中查找。如果图像文件存在,它会在本地加载文件并将文件引用放入内存缓存中。

  3. 如果应用无法从内存缓存或文件缓存中找到所需的图像,它将使用ImageDownloadWorker(扩展AsyncTask)启动线程并下载图像。但是,android 每个应用程序最多只能允许 128 个线程,我正在考虑一种节省一些线程的方法。我创建了这个数据结构:

    // keep all pending downloads
    private HashMap<String, ImageDownloadWorker> downloadTaskMap = new HashMap<String, ImageDownloadWorker>();
    其中的字符串字段将是要下载的 URL。这是为了检查下载某个 URL 的线程是否已经在运行,所以我不必启动另一个线程来下载相同的东西。

我的问题是根据代码,假设应用程序即将下载图像的情况。图像既不在内存缓存中,也不在下载的文件夹中。所以应用程序检查了downloadTaskMap,如果已经有一个线程正在下载这个文件,那么它就不必为同一件事创建一个新的 AsyncTask。 但是我如何知道这个挂起的下载任务何时完成而不阻塞主线程?如果我执行诸如等待/通知或无限循环之类的操作,我想知道这会阻塞 UI 线程吗?

欢迎指点,谢谢!

【问题讨论】:

    标签: java android multithreading android-listview android-asynctask


    【解决方案1】:

    首先,您不需要自己编写所有内容,Android 有许多图像延迟加载解决方案。见here,或者更好的here

    至于异步任务——它们不会同时运行,您应该使用普通的ThreadexecuteOnExecutor 作为this answer 的最新更新建议(否则您将无法在较新的设备上获得并行性)。顺便说一句,我认为您会发现该答案不仅有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多