一个简单的异步加载方案

       android的listview里面通常要实现一些异步加载的场景,比如,listview用于呈现一个帖子的列表,那帖子里面的图片,或者一些帖子其他的即时数据通常就要去异步加载,其中图片这个大问题github上有几个很好的异步加载框架做到了很好的封装,像nostra13的Android-Universal-Image-Loader,square公司的picasso以及android官方团队发布的volley。这里就不献丑了,对于图片的异步加载推荐前面这几个框架,这些框架强大,高效,易用。但是其他一些小的东西,比如帖子有一些异步的数据,例如浏览数这种,有时需要动态去取数据,这是就要自己去实现异步加载了,这里实现一个小的异步模型。

      实现之前是需要申明,这个异步模型是针对你使用了ViewHolder的写法来讲的。因为android里面findViewById()这个方法比较消耗性能,官方提倡使用ViewHolder缓存view,这样每次就不用重新new一个view去实现即将出现在屏幕的item了,但是这样写就引入了一个问题,view被重用了,那原先针对这个item启动的异步任务在获取到数据并且回调的时候可能这个view已经被重用了,比如原先item 1启动的任务,回调后,viewholder已经被重用到了item5上面去了,这时候你如果不做任何处理的话,后果就是回调方法会将item1的数据填充到item5上,导致数据错乱。

      那首先,我们要一个key,最简单直接就是你这次异步请求的url,它是唯一的,然后你先要申明一个HashMap<String, Object> datas,url作为key值,这个HashMap是用来存储你异步取到的数据,接着还要再申明一个HashMap<String, Task> tasks,这个HashMap的key就是url了,然后Task就是异步任务(一个线程或者android提供的AsyncTask),然后在listview的adapter的getView()方法里面,滑到position=n的时候,这时候先在datas里面通过当前的url尝试去取数据,如果为空的话,就尝试去tasks里面尝试去取一个task,如果task有的话,意味着当前这个url已经启动任务去取数据,这时就不做任何处理。

      那如果tasks里面也没有取到异步任务的话,证明当前这个url没有启动异步任务去获取数据,这时候需要启动一个新的任务去取数据了,新建一个task,这个task初始化的时候,先要持有这个任务的url作为key值,然后持有当前这个item的viewholder,这里需要注意的就是这个viewholder里面也需要持有一个url作为key值,然后一般情况下为了实现任务的回调,你也需要传入一个listener进去啦,任务执行完了,回调listener的时候,把数据object存入datas这个HashMap里面,然后再从tasks的HashMap里面移除任务本身,最后就是处理返回的数据了,这个对接的方式就是,用task本身已经持有的url和task持有的viewholder里面的ur进行比较,因为如果viewholder被重用了的话,viewholder持有的url就会被修改的,如果两者url不匹配,那就表示viewholder已经被重用了,那就不做剩下的处理了,而当listview再次滑动到这个item的时候,因为数据已经存储到了datas这个HashMap里面了,所以数据可以立马呈现,如果两者的url是匹配的话,就可以放心把数据填充到这个viewholder里面去了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值