一个优秀的ImageLoader应该具备如下几个功能:
- 图片的同步加载
- 图片的异步加载
- 图片压缩
- 内存缓存
- 磁盘缓存
- 网络拉取
我们分步来实现,首先是图片的压缩,还是用之前学到的Bitemap.Options的inSampleSize。我们命名为ImageResizer的类来实现图片的压缩。
接着我们选择LruChache和DiskLruChache来分别完成内存缓存和磁盘缓存。在ImageLoader初始化时,我们创建LruChache和DiskLruChache:
其中还有对DiskLruChache的容错就是sd卡容量不足时,磁盘缓存将无效。接下来就是提供方法来添加和获取。首先是内存缓存:
而磁盘缓存的添加在之前说过使用Editor来完成的,Editor提供了commit和abort的方法,具体参考下面的loadBimapFromHttp方法。磁盘缓存的读取是通过Snapshot来完成,通过Snapshot可以得到缓存对象对应的FileInputStream,但是FileInputStream无法用BitmapFactroty的核心解析来加载Bitmap,所以要用到描述符,最后加载Bitmap。
同步加载和异步加载接口的设计:
首先看同步加载,同步加载接口需要外部在线程中使用,这是因为同步加载很可能比较耗时,它的实现如下:
在loadBitmap中,首先尝试从内存缓存中通过url来读取图片,接着尝试从磁盘中读取图片,如果都没有图片,则才从网络中去拉取图片。这个方法不能在主线程中调用,否则会抛出异常,这个环境是在loadBitmapFromHttp中实现的,通过检查当前线程的Looper是否为主线程来判断是否为主线程,如果是主线程则抛出异常。
接下来是异步加载的接口:
题外话
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊
这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~
欢迎评论区讨论。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**