2018年1月11日 星期四

[Android] HandlerLeak 處理

問題:
我寫了一個Handler處理訊息,結果Android Studio跳警告說可能引起memory leaks,到底為什麼可能會引起memory leak?除了加上@SuppressLint("HandlerLeak")叫他不要跳警告外,還有甚麼辦法解掉呢?

處理:Google 「HandlerLeak」

參考:清屏網筆記社區簡書

清屏網的文章看來可能引發Leak的情況是:
「當我們通過Handler發送了一個延時消息,這個消息還未來得及處理,當前Activity銷毀了,該消息就會在主執行緒的訊息佇列中等待執行,等待時間到後處理該消息,該消息引用了當前Activity的Handler物件, Handler又引用了當前Activity的物件,這些引用物件會保持到該消息處理完,就導致了當前Activity無法被回收,從而導致了記憶體洩漏。」

那我寫的部分真的會真的會引起memory leak嗎?
可以用筆記社區裡教的方法用AS跟MAT測測看,如果用Android Studio 3.0以上,可用Android Profiler試試,如果該被回收的Activity沒被回收就是囉。

懶得一一測了,那要麼寫才不會引起leak呢?
可參考簡書的這篇文章,跟Android Studio的警告詳細內容寫的解法其實是同一個意思,重點是做個private static class繼承Handler,然後把Activity用WeakReference傳進自製Handler裡處理,目的都是不要直接參考到外部類別(Activity)避免回收不了。

沒有留言:

張貼留言