Android Handler內(nèi)存泄漏原因及解決方案
目錄:
1.須知:
- 主線(xiàn)程Looper生命周期和Activity的生命周期一致。
- 非靜態(tài)內(nèi)部類(lèi),或者匿名內(nèi)部類(lèi)。默認(rèn)持有外部類(lèi)引用。
2.原因:
Handler造成內(nèi)存泄露的原因。非靜態(tài)內(nèi)部類(lèi),或者匿名內(nèi)部類(lèi)。使得Handler默認(rèn)持有外部類(lèi)的引用。在Activity銷(xiāo)毀時(shí),由于Handler可能有未執(zhí)行完/正在執(zhí)行的Message。導(dǎo)致Handler持有Activity的引用。進(jìn)而導(dǎo)致GC無(wú)法回收Activity。
3.可能造成內(nèi)存泄漏
匿名內(nèi)部類(lèi):
//匿名內(nèi)部類(lèi) Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); } };
非靜態(tài)內(nèi)部類(lèi):
//非靜態(tài)內(nèi)部類(lèi) protected class AppHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { // TODO: 2019/4/30 } } }
4.解決方法:
Activity銷(xiāo)毀時(shí),清空Handler中,未執(zhí)行或正在執(zhí)行的Callback以及Message。
// 清空消息隊(duì)列,移除對(duì)外部類(lèi)的引用 @Override protected void onDestroy() { super.onDestroy(); mHandler.removeCallbacksAndMessages(null); } //Handler源碼中removeCallbacksAndMessages()注釋含義 /** * Remove any pending posts of callbacks and sent messages whose * <var>obj</var> is <var>token</var>. If <var>token</var> is null, * all callbacks and messages will be removed. */ public final void removeCallbacksAndMessages(Object token) { mQueue.removeCallbacksAndMessages(this, token); }
靜態(tài)內(nèi)部類(lèi)+弱引用
private static class AppHandler extends Handler { //弱引用,在垃圾回收時(shí),被回收 WeakReference<Activity> activity; AppHandler(Activity activity){ this.activity=new WeakReference<Activity>(activity); } public void handleMessage(Message message){ switch (message.what){ //todo } } }
5. 其他:
即使內(nèi)存泄漏了。待handler中的消息處理完。下次GC時(shí)即可回收本次未回收的內(nèi)存。
以上就是Android Handler內(nèi)存泄漏原因及解決方案的詳細(xì)內(nèi)容,更多關(guān)于Android Handler內(nèi)存泄漏的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 實(shí)現(xiàn)圖片生成卷角和圓角縮略圖的方法
本篇文章主要介紹了Android 實(shí)現(xiàn)圖片生成卷角和圓角縮略圖的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android開(kāi)發(fā)自學(xué)筆記(一):Hello,world!
這篇文章主要介紹了Android開(kāi)發(fā)自學(xué)筆記(一):Hello,world!本文講解了創(chuàng)建HelloWorld工程、編寫(xiě)代碼、啟動(dòng)模擬器等步驟,需要的朋友可以參考下2015-04-04Android App中實(shí)現(xiàn)可以雙擊放大和縮小圖片功能的實(shí)例
這篇文章主要介紹了Android App中實(shí)現(xiàn)可以雙擊放大和縮小圖片功能的實(shí)例,文中的例子不能做到逐級(jí)放大但可以做到邊界控制和以觸摸點(diǎn)為中心進(jìn)行放大,需要的朋友可以參考下2016-03-03Android實(shí)現(xiàn)拍照添加時(shí)間水印
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拍照添加時(shí)間水印,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Android權(quán)限管理之Permission權(quán)限機(jī)制及使用詳解
本篇文章主要介紹了Android權(quán)限管理之Permission權(quán)限機(jī)制及使用,主要講訴了android的權(quán)限使用問(wèn)題,有需要的可以了解一下。2016-11-11Android編程自定義搜索框?qū)崿F(xiàn)方法【附demo源碼下載】
這篇文章主要介紹了Android編程自定義搜索框?qū)崿F(xiàn)方法,涉及Android界面布局、數(shù)據(jù)加載、事件響應(yīng)等相關(guān)操作技巧,并附帶完整demo源碼供讀者下載參考,需要的朋友可以參考下2017-12-12Android開(kāi)發(fā)筆記之:復(fù)寫(xiě)按鈕方法
本篇文章是對(duì)Android中復(fù)寫(xiě)按鈕方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android Studio 3.6 layout文件text模式切換問(wèn)題
這篇文章主要介紹了Android Studio 3.6 layout文件text模式切換問(wèn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Flutter應(yīng)用框架搭建實(shí)現(xiàn)屏幕適配方案詳解
移動(dòng)設(shè)備多樣性,特別是Android的碎片化嚴(yán)重,存在各種各樣的分辨率,flutter跨平臺(tái)開(kāi)發(fā)又需要同時(shí)支持Android和IOS,為盡可能的還原設(shè)計(jì)圖效果提升用戶(hù)的體驗(yàn),根據(jù)設(shè)計(jì)稿設(shè)計(jì)屏幕ui的時(shí)候我們需要考慮到屏幕適配的問(wèn)題2022-11-11