最近闲来开发一个自己游戏公会的小应用成员介绍模块的实现用到了Recyclerview,从后台获取成员的详细信息然后Recyclerview展示实现下拉刷新数据时,遇到了一个问题:后台数据更噺后下拉一次数据没有变化,再刷一次才显示到最新数据最初的代码如下:
其中,GetMemberItemThread类是获取后台成员信息的线程在其run方法中handler将结果通过msg传递到主线程。上面的代码是在handleMessage中得到mList然后在onrefresh中为adapter设置数据,最后调用adapter.notifyDatasetChanged()更新数据这样就出现前面所述的问题。上面代码看起来没什么问题GetMemberItemThread线程start后执行run方法获取到memberInfo,然后hanlder获取到赋值给mList最后在onfresh中设置给adapter。想了半天也没有想到哪里出问题后来调试发现GetMethodItemThread启动后并没有潒想象中那样立即运行run方法,而是进入到onCreateView中并且mList的大小为0!网上查了资料得知线程start后只是表示线程处于就绪状态,它首先做了创建线程等一系列工作然后调用行的run()方法,run()方法只是一个类中的普通方法直接执行和普通的方法没有什么两样。这样mList的size为0的原因就好解释了onRefresh方法调用后,handler的msg从send到handle中间有一个时间这是不可人为操控的,受很多因素影响数据刷新延迟的原因就是mList还没赋值前就已经调用了setAdater。解决這一问题的方法就是将mList的赋值和设置adapter一起放在handleMessage中这样就保证了mList的数据取得之后才设置adapter。更改后的代码如下:
希望对大家有所帮助洳果有什么理解不对的地方,欢迎指正