Android面試準備-handler導致的內存泄露

handler爲開發者提供了不少便利.

但是由於handler是內部類.

如果處理不當有可能引起activity不能即使釋放

內部類的構造函數隱式的持有外部類的引用

public class TestActivity extends Activity {

    private static class MyHandler extends Handler {
    private final WeakReference<TestActivity> mActivity;
    public MyHandler(SampleActivity activity) {
      mActivity = new WeakReference<TestActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
      TestActivity activity = mActivity.get();
      if (activity != null) {
         //do Something
      }
    }
 }

採用弱引用來避免.關於java引用的一些學習

基礎知識:java對象的生命週期

  1. 創建階段(Created)
  2. 應用階段(In Use)
  3. 不可見階段(Invisible)
  4. 不可達階段(Unreachable)
  5. 收集階段(Collected)
  6. 終結階段(Finalized)
  7. 對象空間重分配階段(De-allocated)

 強引用是使用最普遍的引用。如果一個對象具有強引用,那垃圾收器絕不會回收它。當內存空間不足,Java虛擬機寧願拋出OutOfM moryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用 對象來解決內存不足的問題。

軟引用是用來描述一些還有用但並非必須的對象。對於軟引用關聯着的對象,在系統將要發生內存溢出異常之前,將會把這些對象列進回收範圍進行第二次回收。如果這次回收還沒有足夠的內存,纔會拋出內存溢出異常。具體來說就是當內存不夠用需要進行gc時,此時並不會回收關聯的對象,但是會把軟引用關聯的對象放入回收列表中,回收完成以後發現內存還是不夠用.那就把軟引用關聯的對象也進行回收.

弱引用也是用來描述非必須對象的,他的強度比軟引用更弱一些,被弱引用關聯的對象,在垃圾回收時,如果這個對象只被弱引用關聯(沒有任何強引用關聯他),那麼這個對象就會被回收。當gc發生時,第一波就被帶走了.

虛引用:一個對象是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來獲取一個對象的實例。爲一個對象設置虛引用關聯的唯一目的就是能在這個對象被收集器回收時收到一個系統通知。虛引用和弱引用對關聯對象的回收都不會產生影響,如果只有虛引用活着弱引用關聯着對象,那麼這個對象就會被回收。它們的不同之處在於弱引用的get方法,虛引用的get方法始終返回null,弱引用可以使用ReferenceQueue,虛引用必須配合ReferenceQueue使用。

舉個栗子:富豪有三個兒子:第一個嫡出(強引用),第二個庶出(軟引用),第三個尋花問柳不小心得到的(弱引用),第四個帽子戲法.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章