Android网络图片加载

目前开源项目有Android-Universal-Image-Loader和ignition。

其他优化方法1:http://blog.csdn.net/kongbaidepao/article/details/16911747

(优点:使用了多级缓存,考虑了优先加载当前展示给用户的图片(用户直接翻到哪个就先加载哪个),考虑重复图片加载,对网络资源的图片进行了优化(比如大图片如何处理等),整体比较全面;缺点:未使用线程池。)

其他优化方法2:http://www.cnblogs.com/slider/archive/2011/11/22/2258942.html

(优点:采用了策略模式,使用SoftReference;缺点:没有使用强引用,没有线程池,没有考虑重复图片加载,没有考虑优先加载当前展示给用户的图片。

基本思路:

当程序需要加载图片时,按照多级缓存机制去查找对应url的图片,基本流程:强引用->软引用->sdcard->网络获取。

1.一级缓存:强引用(HardReference)即使虚拟机内存吃紧抛出OOM也不会导致这一引用的对象被回收,可以使用LinkedHashMap或者LruCache进行保存对象

2.二级缓存:软引用(SoftReference)用来解决内存不足时,不至于快速回收,同时当内存短缺面临Java VM崩溃抛出OOM前时,软引用将会强制回收内存。可以使用ConcurrentHashMap进行保存对象

3.三级缓存:sdcard

4.通过网络获取图片

注意:

1.加载图片是异步处理过程,需要开启新的线程去处理,这样将不会出现ANR问题,并且需要一个线程池来管理线程的数目。

2.对图片的重复加载进行控制。

3.要考虑优先加载当前展示给用户的图片。

4.LinkedHashMap是线程不安全的,需要用到同步

5.LruCache 其实他内的内部封装的就是1个 LinkedHashMap

6.ConcurrentHashMap是线程安全的,并且支持高并发很有效率。

7.android 4.0 后对 SoftReference 的回收机制进行了改变,所以可以不用二级缓存

8.策略模式,程序里把每次图片下载完成后所进行的操作封装成一个ImageCallback抽象类,使系统更灵活,并易于扩展

拓展:

在Java中内存管理,引用分为四大类,强引用HardReference、弱引用WeakReference、软引用SoftReference和虚引用PhantomReference。它们的区别也很明显,HardReference对象是即使虚拟机内存吃紧抛出OOM也不会导致这一引用的对象被回收,而WeakReference等更适合于一些数量不多,但体积稍微庞大的对象,在这四个引用中,它是最容易被垃圾回收的,而我们对于显示类似Android Market中每个应用的App Icon时可以考虑使用SoftReference来解决内存不至于快速回收,同时当内存短缺面临Java VM崩溃抛出OOM前时,软引用将会强制回收内存,最后的虚引用一般没有实际意义,仅仅观察GC的活动状态,对于测试比较实用同时必须和ReferenceQueue一起使用。对于一组数据,我们可以通过HashMap的方式来添加一组SoftReference对象来临时保留一些数据,同时对于需要反复通过网络获取的不经常改变的内容,可以通过本地的文件系统或数据库来存储缓存。

原文地址:https://www.cnblogs.com/ghw-NO1/p/3443651.html