我有一个问题:在ArrayAdapter的getView()函数中,我使用AsyncTask执行将图像加载到ImageView。但是当这个项目不可见(滚动列表视图)时,AsyncTask函数仍然加载图像。如果item不可见,我想禁用AsyncTask进程。有解决这个问题的方法吗?
答案 0 :(得分:2)
这将涉及两个步骤。
1)意识到项目视图已滚出屏幕(或由于其他原因将不再使用)。
您可以设置使用setRecyclerListener()
添加RecyclerListener
对象,只要项目视图即将被回收(onMovedToScrapHeap()
),该对象就会收到通知。
2)实际上中止了AsyncTask。
这取决于你在里面做了什么。如果执行HTTP请求(从描述中看起来如此),则调用cancel(true)
应该导致中断并中止下载。
但是,在所有这些之前,请考虑:如果正在下载图像并且您中断此过程,则意味着当您向上滚动时可能必须再次下载它。也许更好的策略只是让下载完成,但不加载ImageView
本身它已被重用(你可以通过在其上设置标签来检测)。
答案 1 :(得分:0)
如果图像仍然是应该显示的正确ListView项,您可以检查图像何时加载。如this answer中所述,首先将路径存储为ImageView的标记,然后检入onPostExecute
:
protected void onPostExecute(Bitmap result) {
if (!imv.getTag().toString().equals(path)) {
/* The path is not same. This means that this
image view is handled by some other async task.
We don't do anything and return. */
return;
}
if(result != null && imv != null){
imv.setVisibility(View.VISIBLE);
imv.setImageBitmap(result);
}else{
imv.setVisibility(View.GONE);
}
}
虽然位图仍将完全加载。
答案 2 :(得分:0)
如果任务被取消,您可以使用cancel(true)方法并使用isCancelled()进行检查。
查看文档 http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean)
答案 3 :(得分:0)
如果您不使用RecyclerViews,那么您也可以在getView()中执行以下操作
if(vH.thumb.getTag() != null)
((LoadImage) vH.thumb.getTag()).cancel(true);
LoadImage loadImage = new LoadImage(vH.thumb, context.getActivity());
loadImage.execute(pic);
vH.thumb.setTag(loadImage);
因此,您必须使用ViewHolder(= vH)。它非常有用,如果您正在下载图像,您可以在其中取消下载。
通过询问isCancelled()
你现在何时停止。
我知道这是一个老问题,但这个解决方案对我帮助很大。
答案 4 :(得分:-1)
使用通用图像加载器。在类似的版本中,我使用
displayImage(URL, imageview);
此库在getView中的功能。图像在给定的图像视图上显示,并且非常快。您还可以减小图像大小以加快加载速度。图书馆还将为您节省大量工作并执行/跟踪大量的异步工具。