但是我如何知道视图何时被回收,因此我们需要取消它的异步线程?
答案 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链接到视图的可见性可能是一个坏主意。