1. 程式人生 > 其它 >handler導致的記憶體洩漏及解決方法

handler導致的記憶體洩漏及解決方法

1:非靜態內部類預設持有外部類的引用,只有這樣才能直接使用外部類的屬性和方法,靜態內部類不持有外部類的引用;

2:handler如果sendDelayMessage,比如延遲30S執行訊息,這時候持有的外部類Activity如果被銷燬,但是MessageQueue裡面訊息還未被執行,message的target會持有handler,而handler又持有Activity的引用,導致Activity無法被回收。

3:解決方法:把handler設定為靜態內部類,但是有時候又需要引用到Activity,比如更新UI等,但是靜態內部類預設不持有外部類的引用,這時候可以用弱引用,使handler弱引用Activity。這樣在GC的時候,就可以回收Activity。

4:弱引用和軟引用的區別:軟引用是GC的時候,系統判斷資源不足回收,而弱引用是GC的時候都會回收。

5:因為sendDelayMessage未處理的訊息還存在MessageQueue,如果此時的Activity被銷燬,顯然訊息是不需要的,需要在onDestroy對訊息進行移除,removeMessage