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

1.須知:
- 主線程Looper生命周期和Activity的生命周期一致。
- 非靜態(tài)內(nèi)部類,或者匿名內(nèi)部類。默認持有外部類引用。
2.原因:
Handler造成內(nèi)存泄露的原因。非靜態(tài)內(nèi)部類,或者匿名內(nèi)部類。使得Handler默認持有外部類的引用。在Activity銷毀時,由于Handler可能有未執(zhí)行完/正在執(zhí)行的Message。導致Handler持有Activity的引用。進而導致GC無法回收Activity。
3.可能造成內(nèi)存泄漏
匿名內(nèi)部類:
//匿名內(nèi)部類
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
非靜態(tài)內(nèi)部類:
//非靜態(tài)內(nèi)部類
protected class AppHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// TODO: 2019/4/30
}
}
}
4.解決方法:
Activity銷毀時,清空Handler中,未執(zhí)行或正在執(zhí)行的Callback以及Message。
// 清空消息隊列,移除對外部類的引用
@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)部類+弱引用
private static class AppHandler extends Handler {
//弱引用,在垃圾回收時,被回收
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時即可回收本次未回收的內(nèi)存。
以上就是Android Handler內(nèi)存泄漏原因及解決方案的詳細內(nèi)容,更多關于Android Handler內(nèi)存泄漏的資料請關注腳本之家其它相關文章!
相關文章
Android中okhttp3.4.1+retrofit2.1.0實現(xiàn)離線緩存
這篇文章主要介紹了Android中okhttp3.4.1結合retrofit2.1.0實現(xiàn)離線緩存,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法實例解析
這篇文章主要介紹了Android 媒體開發(fā)之MediaPlayer狀態(tài)機接口方法實例解析,需要的朋友可以參考下2017-08-08
Android?Jetpack組件Lifecycle源碼解析
這篇文章主要為大家介紹了Android?Jetpack組件Lifecycle源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03

