微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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知道不再需要它的数据.

这会让它更清晰吗?

原文地址:https://www.jb51.cc/android/315699.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐