Android:GridView适配器需要下载和显示带有异步任务的图像-速度太慢
我正在开发一个应用程序,它应该可以浏览一个有很多图库和照片的网站的图片。以下是应用程序正在执行的步骤:Android:GridView适配器需要下载和显示带有异步任务的图像-速度太慢,android,performance,gridview,android-asynctask,android-adapter,Android,Performance,Gridview,Android Asynctask,Android Adapter,我正在开发一个应用程序,它应该可以浏览一个有很多图库和照片的网站的图片。以下是应用程序正在执行的步骤: 从rss提要中提取相册及其图像的URL 用每个相册和一个缩略图构建一个列表视图 ListView的adapter getView()方法将每个项目的ImageView设置为占位符,占位符将被相应的AsyncTask替换为实际缩略图 然后,适配器的getView()执行一个异步任务来获取图像 AsyncTask首先检查缓存,如果图片不存在,则下载 使用WeakReferences,AsyncTa
/* 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;
/*GridViewAdapter.getView(…)如下*/
公共视图getView(int位置、视图转换视图、视图组父视图)
图像视图缩略图;
//回收与否。。。
if(convertView==null){
//创建新视图
缩略图=新图像视图(mContext);
}否则{
//循环视图
缩略图=(图像视图)转换视图;
}
//将占位符设置为可绘制
setImageResource(R.drawable.placeholder);
if(位置=1){
//imageFetcher为loadThumbnail(…)的每次调用创建一个AsyncTask
loadThumbnail(缩略图,相册.getURL(位置));
}
//稍微格式化ImageView。。。
...
}
返回缩略图;
如果有人能告诉我,我的方法总体上听起来是否正确,或者我在异步任务方面是否完全走错了方向……从Android
3.0开始,异步任务是按顺序执行的。因此,完全有可能一些长时间运行的AsyncTasks
会阻塞其他任务。为了并发执行,可以使用asyncTask.executeOnExecutor(asyncTask.THREAD\u POOL\u EXECUTOR,params)代码>
但通常一个好的解决方案是创建一个ThreadPoolExecutor
并在其上执行Runnables
。通过这种方式,您可以控制正在运行的任务数量并决定使用哪个顺序 我建议您使用这样的库,使所有占位符/异步图像下载非常非常容易 这解释了很多。因此,最好只让一个任务完成所有下载并执行新任务,以便从缓存加载已经存在的内容。如果您这样做,则从缓存获取图像的任务将被阻止,因为图像下载任务将在该时间内执行。我想你可以为AsyncTask.THREAD\u POOL\u EXECUTOR
发布任务,因为它将至少在两个线程中执行任务。哦,我明白了。我认为一些线程在执行后仍然可以并行运行。好的,我来看看AsyncTask.THREAD\u POOL\u EXECUTOR
能做什么。谢谢,我一定会调查的。由于这是我的第一个应用程序,我试图避免大量使用库。但看看毕加索的源代码也没什么坏处嘿@potAito我本来打算给他同样的答案的。在安卓系统中,图像下载/缓存是一项非常深入而复杂的任务,使用毕加索库非常容易。你所要做的就是:Picasso.with(context).load(url).into(imageView)代码>它只是works@Budius你的意思是,在这种情况下,自己编写程序不是一件丢脸的事吗?:)好的,我试试看。我现在正在添加毕加索图书馆。我只是说,如果有人已经做了毕加索那样伟大的工作,没有理由重新发明轮子。理解引擎盖下发生的事情非常酷,但仅此而已。我可以向你保证,有很多拥有数百万用户的大型应用程序严重依赖于这些库。@Budius你是绝对正确的。我刚刚在我的应用程序中替换了相应的行,它就像一个符咒。用于下载图像你可以看到这些,