当视图在listview中变为循环时,如何知道何时取消asynctask

时间:2014-12-10 17:01:33

标签: java android

在listview中,视图被回收,因此asynctask(如果被调用)将需要被取消。您可以通过以下方式执行此操作:cancel(true);

但是我如何知道视图何时被回收,因此我们需要取消它的异步线程?

2 个答案:

答案 0 :(得分:1)

您必须为要下载的每个imageview设置一个标记,例如,如果您要在第10位下载imageview,请在imageview中设置一个带有值的标记“10”和asynctask的对象负责下载url。现在每当你得到一个新的imageview(getview将它传递给你)时,检查标签中存储的位置,如果它与getview中位置的值相同则表示{标签内的{1}}正在下载正确的asynctask,我们都很高兴,但如果url中存储的位置与getview位置不同,请取消存储的imageview和创建一个新的,并在asynctask标记中存储新的位置值。在这种情况下,您还必须在imageview中将imageview引用存储为weakreference,以便在下载过程完成后,您必须将图像设置为asynctask。这称为imageview。为了从互联网下载较少的图像,您可以在lazy loading中存储图像,因此对于每个新请求,请先检查缓存,然后创建新的LRUCache

答案 1 :(得分:0)

在适配器的convertView中检查getView是否为空,或者如果您想知道视图何时可以回收:

ListView.setRecyclerListener(new OnRecyclerListener() {
    public void onMovedToScrapHeap(View view) {
        // view is available to be recycled / been moved off screen
    }
});

虽然将AsyncTask链接到视图的可见性可能是一个坏主意。