VM4*_*VM4 7 android android-listview android-asynctask
在阅读本文之后,我遇到了这个问题:性能提示(特别是名为"异步加载"的部分).基本上他正在尝试保存有关行的信息以查看它是否已被回收,并且只有在行仍然可见时才设置下载的图像.这就是他如何挽救这个位置:
holder.position = position;
new ThumbnailTask(position, holder)
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
Run Code Online (Sandbox Code Playgroud)
ThumbnailTask构造函数是:
public ThumbnailTask(int position, ViewHolder holder) {
mPosition = position;
mHolder = holder;
}
Run Code Online (Sandbox Code Playgroud)
在onPostExecute()中,他然后执行前面提到的检查:
if (mHolder.position == mPosition) {
mHolder.thumbnail.setImageBitmap(bitmap);
}
Run Code Online (Sandbox Code Playgroud)
我只是看不出这会给出任何结果.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知道不再需要它的数据.
这会让它更清晰吗?