强、软、弱、虚引用(案例)

版权声明:转发请标明原著 https://blog.csdn.net/weixin_39460667/article/details/83116171

  

前言:如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。

1.强引用(StrongReference)

  强引用就是指在程序代码之中普遍存在的,比如下面代码中的objec是强引用:

Object object = new Object();

  只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。

 2.软引用(SoftReference)

  软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。

  软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。如下:

String str = new String("hello");

SoftReference softReference = new SoftReference(str);

 

3.弱引用(WeakReference)

  弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。

  弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。

        String str = new String("hello");

        WeakReference weakReference = new WeakReference(str);

 

4.虚引用(PhantomReference)

  虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);

Android 避免oom 案例

使用软引用避免oom(图片加载)

    View view = findViewById(R.id.button);
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
    Drawable drawable = new BitmapDrawable(bitmap);
    SoftReference<Drawable> drawableSoftReference = 
                                                new SoftReference<Drawable>(drawable);
    if(drawableSoftReference != null) {
        view.setBackground(drawableSoftReference.get());
    }

避免内存泄漏(handler 静态内部类)

 private static class MyHandler extends Handler {
        WeakReference<MainActivity> weakReference ;

        public MyHandler(MainActivity activity ){
            weakReference  = new WeakReference<MainActivity>( activity) ;
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if ( weakReference.get() != null ){
                // update android ui
            }
        }
    }

The End

猜你喜欢

转载自blog.csdn.net/weixin_39460667/article/details/83116171