1. 程式人生 > >強、軟、弱、虛引用(案例)

強、軟、弱、虛引用(案例)

前言:如果只是想避免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