在進行非同步操作時,我們經常會使用到handler類。常見的寫法如下。
public
class mainactivity extends activity
};
} 當使用內部類或匿名內部類的方式建立handler時,handler物件會隱式地持有乙個外部類物件的引用(這裡的外部類是activity)。一般在乙個耗時任務中會開啟乙個子執行緒,如網路請求或檔案讀寫操作,我們會使用到handler物件。但是,如果在任務未執行完時,activity被關閉了,activity已不再使用,此時由gc來**掉activity物件。由於子執行緒未執行完畢,子執行緒持有handler的引用,而handler又持有activity的引用,這樣直接導致activity物件無法被gc**,即出現記憶體洩漏。
所以這段**有可能會引起記憶體洩漏。
下面用一段**示例來說明。
public
class mainactivity extends activity
}).start();
} private handler mhandler = new handler()
} };
} 解決方法主要在於兩點:
1.將handler宣告為靜態內部類。因為靜態內部類不會持有外部類的引用,所以不會導致外部類例項出現記憶體洩露。
2.在handler中新增對外部activity的弱引用。由於handler被宣告為靜態內部類,不再持有外部類物件的引用,導致無法在handlemessage()中操作activity中的物件,所以需要在handler中增加乙個對activity的弱引用。
改善之後的**如下。
public
class mainactivity extends activity
@override
public
void handlemessage(message msg)
// your code here
} }
}
關於weakreference的說明:
weakreference即弱引用,與強引用(即我們常說的「引用」)相對。它的特點是,gc在**時會忽略掉弱引用,即就算有弱引用指向某物件,但只要該物件沒有被強引用指向,該物件就會在被gc檢查到時**掉。
安卓 Handler引起的記憶體洩漏
myhandler activity activity override public void handlemessage message msg 將 改為以上形式之後,就算完成了。還有一種就是當activity銷毀的時候,也就是在ondestroy 方法裡加上 mhandler.removeca...
防止handler記憶體洩漏
記憶體洩漏 程式執行會用到記憶體,在退出程式的時候,占用記憶體的資料沒有釋放,那麼當資料越來越多的時候,就會產生記憶體洩漏。handler為什麼會記憶體洩漏呢,handler是個內部類,內部類會持有外部類的引用,內部類需要依賴外部類。handler需要定義為靜態類,當你推出activity,hand...
Handler系列之記憶體洩漏
本篇簡單的講一下平常使用handler時造成記憶體洩漏的問題。什麼是記憶體洩漏?大白話講就是分配出去的記憶體,不回來。嚴重會導致記憶體不足oom。下面來看一下造成記憶體洩漏的 public class memoryleakactivity extends activity private class...