Android:GridView Adapter 需要使用异步任务下载和显示图像 - 太慢了

标签 android performance gridview android-asynctask android-adapter

我正在构建一个应用程序,它应该可以浏览包含大量画廊和照片的 Internet 站点的图像。以下是该应用程序正在执行的步骤:

  1. 从 rss 提要中提取相册及其图像的 URL
  2. 用每个专辑和一个缩略图构建一个 ListView
  3. ListView 的适配器 getView() 方法将每个项目的 ImageView 设置为一个占位符,该占位符将由相应的 AsyncTask 替换为真实缩略图
  4. Adapter 的 getView() 然后执行一个获取图像的 AsyncTask
  5. AsyncTask 首先检查缓存,如果图片不存在,则下载
  6. 使用 Wea​​kReferences,AsyncTasks 使用获取的图像更新(或不更新)所需的 View ,从而替换占位符

  7. 打开相册时,我执行与步骤 2 中相同的过程,但使用 GridView 而不是 ListView 来显示相册内容。

    /* GridViewAdapter.getView(...) follows */
    public View getView(int position, View convertView, ViewGroup parent)
     ImageView thumbnail;
    
     // Recycle or not...
     if (convertView == null) {
       // Create new View
       thumbnail = new ImageView(mContext);
     } else {
       // Recycle View
       thumbnail = (ImageView) convertView;
     }
    
     // Set the placeholder Drawable
     thumbnail.setImageResource(R.drawable.placeholder);
    
    if (position < amountOfPhotos) {
    
        if (album.getLinks().size() >= 1) {
    
          // imageFetcher creates an AsyncTask for every call of loadThumbnail(...)
          imageFetcher.loadThumbnail(thumbnail, album.getURL(position)); 
        }
    
    // Formating the ImageView a little...
    ... 
    
    }
    return thumbnail;
    

问题是 AsyncTasks 的性能。当用户滚动列表时,ListView 在我的手机上显示大约 7 个项目,导致大约十几个同时发生的 AsyncTasks。这很好,列表仍然可以快速建立。

现在,相册的 GridView 一次显示 15 个项目,滚动列表会创建许多 AsyncTask。由于某些 AsyncTasks 必须从 Web 下载,因此它们会存活几秒钟。这完全减慢了 AsyncTasks,它只需要从缓存中重新加载位图。

结果是,只要有许多 AsyncTasks 正在运行,GridView 就不会在向上滚动时显示图像,即使它在几秒钟前才显示过图像。很简单,因为 AsyncTasks 太多了。

关于如何解决我的问题有什么建议吗?我在考虑类似 AsyncTask 工厂的东西,我可以在其中对作业进行排队并设置优先级。这样我就可以控制接下来执行哪个作业,还可以控制一次运行的最大 AsyncTask 数量。

如果有人能告诉我我的方法总体上听起来是否正确,或者如果我在这里使用 AsyncTasks 完全走错了路,那已经对我有帮助了......

最佳答案

我建议你使用类似 Picasso 的库这使您所有的占位符/异步图像下载变得非常非常简单!

关于Android:GridView Adapter 需要使用异步任务下载和显示图像 - 太慢了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25689287/

相关文章:

android - 如何在新的ListView Activity中保存EditText数据

Android Java 服务和定时器/线程休眠

python - pandas系列的for循环性能

performance - 如何使用仪器或查看组件确定 ARC 保留哪些对象?

android - 如何在 Android 的 GridView 中使用预加载器

android - 操作栏菜单项文本为大写

java - Android - fragment findViewById() 始终为空?

asp.net - 为什么要在 ASP.NET 健康监控上使用 HTTP 模块,反之亦然?

c# - 为什么 Gridview 页脚要添加一个额外的列?

Asp.Net GridView EditIndex 竞争条件?