解决异步加载gridview listview数据时出现的数据错乱问题

1 篇文章 0 订阅
1 篇文章 0 订阅

这两天做一个相册功能。

用上了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) {

                }
            });


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值