Android Handler內(nèi)存泄漏原因及解決方案
目錄:

1.須知:
- 主線程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)靜默安裝與卸載的方法,涉及Android權(quán)限與命令行操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05
Android中okhttp3.4.1+retrofit2.1.0實(shí)現(xiàn)離線緩存
這篇文章主要介紹了Android中okhttp3.4.1結(jié)合retrofit2.1.0實(shí)現(xiàn)離線緩存,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android 列表選擇框 Spinner詳解及實(shí)例
這篇文章主要介紹了Android 列表選擇框 Spinner詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android屬性動(dòng)畫(huà)之ValueAnimator代碼詳解
這篇文章主要介紹了Android屬性動(dòng)畫(huà)之ValueAnimator代碼詳解,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Android 媒體開(kāi)發(fā)之MediaPlayer狀態(tài)機(jī)接口方法實(shí)例解析
這篇文章主要介紹了Android 媒體開(kāi)發(fā)之MediaPlayer狀態(tài)機(jī)接口方法實(shí)例解析,需要的朋友可以參考下2017-08-08
Android開(kāi)發(fā)中的單例模式應(yīng)用詳解
這篇文章主要介紹了Android開(kāi)發(fā)中的單例模式應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了Android開(kāi)發(fā)中常用單例模式的實(shí)現(xiàn)與使用方法,需要的朋友可以參考下2018-01-01
Android?Jetpack組件Lifecycle源碼解析
這篇文章主要為大家介紹了Android?Jetpack組件Lifecycle源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

