handler導致的記憶體洩漏及解決方法
阿新 • • 發佈:2022-03-23
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