android – 异步图像加载,检查图像是否被回收

读完这篇文章之后,这个问题就出现了: Performance tips(特别是名为“异步加载”的部分).基本上他正在尝试保存有关行的信息以查看它是否已被回收,并且只有在行仍然可见时才设置下载的图像.这就是他如何挽救这个位置:
holder.position = position;

new ThumbnailTask(position,holder)
        .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,null);

ThumbnailTask​​构造函数是:

public ThumbnailTask(int position,ViewHolder holder) {
    mPosition = position;
    mHolder = holder;
}

在onPostExecute()中,然后他执行前面提到的检查:

if (mHolder.position == mPosition) {
        mHolder.thumbnail.setimageBitmap(bitmap);
    }

我只是看不出这会给出任何结果. Holder和position在构造函数中同时设置为相同的值(holder中的位置与mPosition中的位置相同).它们在AsyncTask期间不会被更改(确实位置可能在getView()中发生变化,但是作为私有成员存储在AsyncTask中的那些永远不会被操纵).我在这里想念的是什么?

同时保存位置似乎不是一个好的选择:我相信它不能保证是唯一的,如果我没记错,它会在滚动后重置为0.我在想正确的方向吗?

解决方法

背景(您可能知道这一点,但以防万一):适配器包含一组对象,并使用这些对象的信息来填充视图(每个视图都是列表中的行项).列表视图负责显示这些视图.出于性能原因,ListView将回收不再可见的视图,因为它们滚动了列表的顶部或底部.这是它如何做到的:

当ListView需要一个新的视图来显示时,它调用适配器的getView并使用整数参数“position”来指示它想要看到的适配器集合中的哪个对象(位置只是从1到N -1的数字),其中N是适配器中的对象数.

如果它有任何不再可见的视图,它也会将其中一个传递给适配器,因为“convertView”这表示“重用这个旧视图而不是创建一个新视图”.一场巨大的表现胜利.

本文中的代码将ViewHolder对象附加到它创建的每个视图,其中包含ListView请求的对象的位置.在文章代码中,这个位置被隐藏在ViewHolder中,同时指向视图中将包含图像的字段. ViewHolder作为标记(单独的主题)附加到View.

如果视图被回收以容纳不同的对象(在不同的位置),那么ListView将调用Adapter.getView(newPosition,oldView …).文章中的代码将新位置存储到附加到oldView的ViewHolder中. {到目前为止有道理?)并开始加载这个新图像以放入视图.

现在在文章中,它启动了一个AsyncTask来检索应该进入视图的数据.这个任务有位置(来自getView调用)和holder(来自oldView).该位置告诉它请求了哪些数据.持有人告诉它该视图中当前应该显示哪些数据以及一旦显示它就放在哪里.

如果在AsyncTask仍在运行时视图再次被回收,则持有者中的位置将被更改,因此这些数字将不匹配,并且AsyncTask知道不再需要它的数据.

这会让它更清晰吗?

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...