手写ImageLoader实战与应用及列表错位、卡顿的优化

我们学习了Bitmap的相关知识点,了解了LruCache、DiskLruCache。结合我们之前所学的知识就可以仿照ImageLoader实现我们自己的ImageLoader了。

1、 ImageLoader应该具有的功能
  • 图片的同步加载
  • 图片的异步加载
  • 三级缓存
  • 图片压缩
2、列表错位的原因(ListView等列表)

ListView或者Gridview中,view的复用既是他们的优点,又是他们的缺点,优点我们都知道了,缺点呢?考虑一种情况listView的itemA正在网络加载图片,它对应ImageviewA。这时候用户快速向下滑动列表,很可能ItemB复用了itemA,然后等了一会之前的图片下载完毕,如果直接给itemA设置图片,这时itemA被itemB复用了,但是itemB要显示的图片显然不是itemA请求下载好的图片,这时itemB显示了itemA的图片就是常见的列表错位
ps:解决方案:给图片设置url时检测图片url是否发生改变,如果发生改变就不给他设置图片。
具体例子参考我们项目实现。

3、手写ImageLoader的实现

学习这里之前我们最好具备以下知识点:
1、Bitmap的加载和Cache
2、Handler的使用(第一行代码、安卓开发艺术探索,都有讲解)
3、线程池使用及自定义线程池

项目实战下载由于代码太多就不在详细讲解了,本案例学习与《安卓开发艺术探索》自己加以改动而成。在代码中加了详细注释,可以参考着书本,在加上本案例详细的注释,很容易自己上手。
4、优化列表卡顿现象

这个原因困扰了很多开发者,其实答案很简单,不要在主线程中做太耗时的操作即可提升滑动的流畅度。可以从一下三方面来说明这个问题:

  • 不要在getView(Listview的adapter)中做耗时操作
    如果直接在这个方法中加载图片必定卡顿,我们可以通过异步任务来完成这个耗时操作(如我们上面自己实现的MyImageLoader就是异步加载)
  • 控制异步任务执行频率
    对于列表来说,仅仅通过异步加载图片是不够的,就拿我们的Listview异步加载好多图片来说,如果用户可以频繁的上下滑动,这会在一瞬间产生上百个异步任务,这些异步任务会造成线程池拥堵,还会造成大量的UI操作,这时不卡才怪。。。。
    解决方案:在用户滑动的时候停止加载图片,尽管这个过程是异步的,等列表停下来再加载图片,可以给用户滑动的友好体验,滑动流畅。给空间设置滑动监听处理下逻辑即可。
  • 开启activity的硬件加速
    一般来说,经历如上两步,就不会再卡顿,但是在某些特殊情况下列表会偶尔卡顿,这时候我们如果开启硬件加速,可能就会解决这些莫名的卡顿问题。绝大多数或情况下硬件加速都可以解决莫名卡顿问题。(开启方法如下)
    在这里插入图片描述
5、卡顿及其错位处理

我们写好MyImageLoader后结合列表卡顿、错位加以Demo练习:源码参考

效果:滑动流畅,滑动时不加载图片,停止时开始加载。
在这里插入图片描述

6、小结

大略实现一遍,收获颇丰。

The end

参考《安卓开发艺术探索》

猜你喜欢

转载自blog.csdn.net/qq_38350635/article/details/89389260