我正在构建一个应用程序,它应该可以浏览包含大量画廊和照片的 Internet 站点的图像。以下是该应用程序正在执行的步骤:
- 从 rss 提要中提取相册及其图像的 URL
- 用每个专辑和一个缩略图构建一个 ListView
- ListView 的适配器 getView() 方法将每个项目的 ImageView 设置为一个占位符,该占位符将由相应的 AsyncTask 替换为真实缩略图
- Adapter 的 getView() 然后执行一个获取图像的 AsyncTask
- AsyncTask 首先检查缓存,如果图片不存在,则下载
使用 WeakReferences,AsyncTasks 使用获取的图像更新(或不更新)所需的 View ,从而替换占位符。
打开相册时,我执行与步骤 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/