卧槽,我必须吐槽一下,老师的代码风格,跟我写的完全不一样啊(虽然我是小白但是代码风格和官方源码很像几乎模仿),简单的代码写的很复杂,我没法接受,去看blog算了。面向对象的思想没有怎么用,我感觉老师是用C或者其他语言转到Android的。
2016-05-30
如果给每个ImageView设置了tag以后,当1-8号异步线程运行完毕后,会发消息给handler,让他进行更新ui的操作,可是在1-8号线程发消息之前,9-16号线程已经更新了1-8和9-16共用的ImageView控件的tag,所以1-8号线程的消息虽然发给了handler,但是不满足条件,handler不会进行ui更新。
p.s.完全理解这整个过程真的不容易,希望对你们有帮助。
p.s.完全理解这整个过程真的不容易,希望对你们有帮助。
2016-05-30
纯手工跟打,注释大部分保留,还加了自己的注释,分享给各位moocer;
链接:http://pan.baidu.com/s/1c0sJlO 密码:w3aq
链接:http://pan.baidu.com/s/1c0sJlO 密码:w3aq
2016-05-29
然而这里使用了异步机制,也就是说先返回ConvertView,再等异步线程修改,这是闪的本质!由于教程里使每个异步线程人工阻塞了1s,那么上来有8个异步线程在运行(编号1-8),如果1s之内下滑了ListView比如说下滑了8个,那么新更新的8个item还是用的以前的内存,【并且】又开启了8个异步线程(编号9-16)。因为预先设定了一个默认图片,所以先显示绿色的默认icon图片。然后1-8号异步线程运行完毕,更新ImageView(闪),紧跟着9-16异步线程运行完毕,又更新imageView(闪),最终显示正确结果。这就是下滑时先显示默认图片,再闪一下错误图片,最后闪一下正确图片的本质过程。
2016-05-29
我来说一下为什么会闪。这是【同时】使用ConvertView和异步机制造成的。一个屏幕一次显示8个item,当第9个item划进屏幕时,ListView对adapter说,返给我一个view,我要显示。adapter调用getView()方法,由于使用了缓存机制,getView()在初始化8个item以后所有返回的view(ConvertView)内存地址都是这8个中的。如果【不使用】异步机制加载图片,那么返回的这个ConvertView是被更新以后返给ListView使用的。效果是上滑屏幕没反应,等了半天,突然加载出来,但是不会闪。
2016-05-29