Java从JDK1.2之后就将对象的引用分为4个级别:强引用、软引用、弱引用、虚引用。具体的概念不详述了。
软引用:当内存空间足够的时候,GC就不会回收它,内存空间不足了,就会回收。
弱引用:GC工作过程中,一旦发现了弱引用对象,不管内存足够与否,都会回收它的内存。
所以,从上述可以看出,软引用和弱引用的根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。
当缓存大量的Bitmap时,比较容易造成OOM,所以可以考虑使用软引用技术来避免这个问题的发生。
02 | private Map<string, SoftReference<Bitmap>> imageCache = |
03 | new HashMap<String, SoftReference<Bitmap>>(); |
05 | public void addBitmapToCache(String path) { |
07 | Bitmap bitmap = BitmapFactory.decodeFile(path); |
09 | SoftReference<Bitmap> softBitmap = |
10 | new SoftReference<Bitmap>(bitmap); |
12 | imageCache.add(path, softBitmap); |
16 | public Bitmap getBitmapByPath(String path) { |
18 | SoftReference<Bitmap> softBitmap = imageCache.get(path); |
20 | if (softBitmap == null ) { |
24 | Bitmap bitmap = softBitmap.get(); |
使用软引用之后,在OOM异常发生之前,这些缓存的图片资源空间都会被释放掉,从而可以避免程序因为OOM而Crash。
什么时候使用软引用,什么时候使用弱引用?
建议:如果只想避免OOM,则使用软引用;如果该对象经常被使用,则使用软引用;如果想尽快回收一些占用内存比较大的对象,则使用弱引用;