Android开发优化方案之软引用和弱引用的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Dota_wy/article/details/81945949

对象的引用分为四种级别,为了能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

本篇主要介绍软引用和弱引用的使用和区别

一、软引用:SoftReference
如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。即缓存空间不够时才会选择去回收和释放部分内存。
二、弱引用:WeakReference
如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。即只要运行程序中扫描到就会回收和释放内存。

二者的区别:

只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候,通常不被回收。
1、想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。
2、根据对象是否经常使用来判断。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。

应用场景:

当程序中需要使用大量图片,频繁读取会影响手机性能,所以需要做缓存处理,而图片占用内存过大,所以就会出现我们常遇到的OOM异常了,这时我们可以使用软引用来解决这类问题。
保存Bitmap的软引用到HashMap
private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();


public void addBitmapToCache(String path) {

        // 强引用的Bitmap对象

        Bitmap bitmap = BitmapFactory.decodeFile(path);

        // 软引用的Bitmap对象

        SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);

        // 添加该对象到Map中使其缓存

        imageCache.put(path, softBitmap);

    }
获取的时候,可以通过SoftReference的get()方法得到Bitmap对象
public Bitmap getBitmapByPath(String path) {

        // 从缓存中取软引用的Bitmap对象

        SoftReference<Bitmap> softBitmap = imageCache.get(path);

        // 判断是否存在软引用

        if (softBitmap == null) {

            return null;

        }

        // 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空

        Bitmap bitmap = softBitmap.get();

        return bitmap;

    }

参考网址:https://blog.csdn.net/arui319/article/details/8489451

猜你喜欢

转载自blog.csdn.net/Dota_wy/article/details/81945949