如何从Android中的getView()函数中的隐藏项取消AsyncTask执行?

时间:2014-07-04 14:51:56

标签: android listview android-asynctask android-arrayadapter

我有一个问题:在ArrayAdapter的getView()函数中,我使用AsyncTask执行将图像加载到ImageView。但是当这个项目不可见(滚动列表视图)时,AsyncTask函数仍然加载图像。如果item不可见,我想禁用AsyncTask进程。有解决这个问题的方法吗?

5 个答案:

答案 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中的功能。图像在给定的图像视图上显示,并且非常快。您还可以减小图像大小以加快加载速度。图书馆还将为您节省大量工作并执行/跟踪大量的异步工具。