SyncLoadBitmapDemo(图片异步加载)代码阅读

在读http://www.eoeandroid.com/thread-254866-1-1.html这篇文章的时候,阅读对应代码时有些不解,仔细分析才能明白,以此记录

PhotoToLoad 里面包含了url 和imageView,mImageLoader.DisplayImage将url 和imageview作为一对存储到imageViews里面。当要显示一个新view的时候,这个view里面可能已经有存在了(参考    http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html    )。

在图片下拉的过程中,可能先调用position为0的 getView,然后调用position为15的getview,而这两者的convertView可能是同一个,那imageview也是同一个。getview会调用 DisplayImage然后调用queuePhoto,然后起线程PhotosLoader,,所以0的getview可能会导致起了一个线程0, 15的getview会导致起了个线程15。实际上此时已经拉到15的位置,0已经看不到了,那15对应的view需要绘制,而0的不需要绘制。线程里怎么判断当前view是否需要绘制呢?使用imageViewReused函数。每次display的时候会imageViews . put( imageView , url );后来的会覆盖先前的,也就是15的会覆盖0的,那么此时imageViews 里存的就是15的url。只要判断这个url是否和当前的url一致,如果一致,那么当前就是15的view,需要绘制,如果不一致,那就是0的view,不需要绘制,直接返回就好了。 imageViewReused返回为true就不需要绘制,返回false就需要绘制。imageViewReused中除了不等返回true,在tag为null的时候也返回true,tag为null可能是由于软引用被系统回收了(imageViews 是 WeakHashMap ),被系统回收了也不需要刷新界面(个人猜想,既然系统回收了,那估计过了好长的时间,那肯定是旧的view了)
              boolean   imageViewReused( PhotoToLoad  photoToLoad  )   {
            
                          String  tag  =  imageViews .  get  ( photoToLoad  .  imageView );
            
                          if   (  tag  ==   null   ||  ! tag  .  equals (  photoToLoad  . url  ))
                          {
                                      return   true  ;
                          }
                          return   false  ;
              }


原代码中还有个错误,如下false应该改为true(按照文章的意思)

else {
mImageLoader.DisplayImage(url, viewHolder.mImageView, false);
viewHolder.mTextView.setText("--" + position + "--FLING");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值