这两天做一个相册功能。
用上了universal-image-loader.
当我异步加载图片的时候,快速上下滑动,会出现数据错乱, 作为一个新手完全不知道怎么回事。
仔细思考为什么会出现这种问题呢?
其实这个原因在异步操作里是比较常见的。
前提(这里我们通过ViewHolder的方式进行了优化)如果不通过ViewHolder自然不会有这个问题,但是这样性能会很差。
问题当然出在getView这个函数内。
当我们拥有一个ImageView, 我们会通过异步加载图片,最后setImageBitmap的方式设置图片。
但是当我们迅速滑动的时候,convertView由于ViewHolder的原因,将会被复用。
假设: 线程A正在加载position = 20位置的数据, 但是由于迅速的滑动, 这个ImageView 被 position = 10的元素复用了该View,此时又通过线程B去加载position = 10的图片数据。
因为是异步线程,我们并不能保证线程A一定在线程B之前处理完成,如此,就导致了数据显示的错乱。
这样我们如何解决这个问题呢?
其实也简单, 我们只需要进行身份确认就可以了, 当然身份确认在UI线程进行。
View中有个setTag()函数正好可以给我们使用,太方便了,都不需要自己写!
只需要在异步任务之前,先给他setTag,具体的值可以自己选取,只需要根据position是唯一值即可。
放一段简短的代码好了。
imageView.setTag(position);
imageLoader.loadImage("file://" + uri, imageSize, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String s, View view) {
}
@Override
public void onLoadingFailed(String s, View view, FailReason failReason) {
//Log.d("sss", "" + failReason.getType());
}
@Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
if (imageView.getTag() == position) {
imageView.setImageBitmap(bitmap);
}
}
@Override
public void onLoadingCancelled(String s, View view) {
}
});