生活随笔
收集整理的這篇文章主要介紹了
Android中使用Handler(消息机制)造成内存泄露的分析和解决
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述:
Handler 內部類持有 外部類Activity的引用,如果Activity退出而Handler還有延遲處理的消息沒有處理完,會導致Activity不能回收,反復如此會導致內存泄露。
解決方案:
1、onDestroy時清除消息。
mHandler.removeCallbacksAndMessages(null); // 參數為null時會清除所有消息。
2、聲明Handler為static并持有Activity的弱引用。
public class MainActivity
extends Activity {private static final String tag = "MainActivity"
;private TextView mTvShow;private MyHandler mHandler;private static final int DELAY_TIME = 10000;
// set to 5s and 10s to check result.
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mHandler =
new MyHandler(MainActivity.
this);Log.e(tag, "onCreate"
);mTvShow =
(TextView) findViewById(R.id.tv_show);new Thread() {@Overridepublic void run() {mHandler.sendEmptyMessageDelayed(1
, DELAY_TIME);Log.e(tag, "msg send"
);}}.start();}@Overrideprotected void onDestroy() {Log.e(tag, "onDestroy"
);super.onDestroy();}static class MyHandler
extends Handler {WeakReference<MainActivity>
mWeakActivity;//強調弱引用public MyHandler(MainActivity activity) {mWeakActivity =
new WeakReference<>
(activity);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);MainActivity activity =
mWeakActivity.get();Log.e(tag, "handleMessage," +
msg.what);// 5s為空,10s為空-通知Activity被回收if (
null ==
activity) {Log.e(tag, "null"
);} else {Log.e(tag, "not null"
);activity.mTvShow.setText("delay show"
);}}}} ?
轉載于:https://www.cnblogs.com/Quejamais/p/5650666.html
總結
以上是生活随笔為你收集整理的Android中使用Handler(消息机制)造成内存泄露的分析和解决的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。