Android 弱引用 (WeakReference)的使用
1 弱引用 (WeakReference)
弱引用對象,這些對象不會阻止對其引用對象進行終結,終結和回收。弱引用最常用于實現規范化映射。假設垃圾收集器在某個時間點確定對象是弱可到達的。到那時,它將自動清除對該對象的所有弱引用以及對所有其他弱可達對象的弱引用,這些對象都可以通過一系列強引用和軟引用從該對象到達。同時,它將聲明所有以前弱可及的對象都是可終結的。同時或稍后,它將把那些新近清除的弱引用加入隊列,這些弱引用已在引用隊列中注冊
簡單的理解就是:弱引用用來描述非必須對象的,當gc進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯的對象。
1.1?下面以定義一個String 對象來說下弱引用 (WeakReference)的使用
WeakReference<String> str = new WeakReference<>("弱引用");Log.e("---------str", str.get());
1.2 加載一個圖片的demo
先看下普通的使用
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.image);Drawable drawable = new BitmapDrawable(bitmap);imageView.setBackground(drawable);
如果使用弱引用 (WeakReference)如下
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.image);Drawable drawable = new BitmapDrawable(bitmap);WeakReference<Drawable> weakDrawable = new WeakReference<>(drawable);Drawable bgdrawable = weakDrawable.get();if(bgdrawable != null) {imageView.setBackground(drawable);}
擴展下引用,引用有4中強引用、軟引用、弱引用、虛引用
2 強引用:
String st = new String("強引用");
如果一個對象具有強引用,那垃圾回收器絕不會回收它。當內存空間不足,Java虛擬機寧愿拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足的問題
3 軟引用(SoftReference)
下面是官方的說法:
軟引用對象,垃圾回收器會根據內存需求酌情清除這些對象。
假設垃圾收集器在某個時間點確定可以輕柔地到達對象。那時,它可以選擇原子地清除對該對象的所有軟引用,以及對所有其他軟可訪問對象的所有軟引用,這些對象都可以通過一系列強引用從該對象到達該對象。同時或在以后的某個時間,它將排隊那些已在引用隊列中注冊的新清除的軟引用。
確保在虛擬機拋出之前清除了對所有可軟訪問對象的軟引用?OutOfMemoryError。否則,在清除軟引用的時間或清除對不同對象的一組此類引用的時間上將沒有任何限制。但是,鼓勵虛擬機實現偏向于清除最近創建或最近使用的軟引用。
避免使用軟引用進行緩存
實際上,軟引用在緩存方面效率低下。運行時沒有足夠的信息來清除和保留哪些引用。最致命的是,在清除軟引用和增大堆之間進行選擇時,它不知道該怎么辦。
缺少有關每個參考的應用價值的信息,限制了軟參考的實用性。過早清除引用會導致不必要的工作;那些清除得太晚會浪費內存。
大多數應用程序應使用android.util.LruCache而不是軟引用。LruCache具有有效的逐出策略,并允許用戶調整分配的內存量。
軟引用的使用和弱引用差不多
SoftReference<String> str = new SoftReference<>("軟引用");Log.e("---------str", str.get());
4 虛引用(PhantomReference)
虛引用和前面的軟引用、弱引用不同,它并不影響對象的生命周期。如果一個對象與虛引用關聯,則跟沒有引用與之關聯一樣,在任何時候都可能被垃圾回收器回收。
?
參考文章:https://www.jianshu.com/p/8488079a939b
?
?
總結
以上是生活随笔為你收集整理的Android 弱引用 (WeakReference)的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个好听的社区名字。
- 下一篇: Android 接入Realm并使用