Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//do some code
super.handleMessage(msg);
}
}
編譯成功,但卻提示This Handler class should be static or leaks might occur,意思就是說:Handler類必須聲明爲靜態的,否則將會內存泄漏,接着我想當然的把handler聲明爲靜態的,結果也是同樣出現這個警告,於是上谷歌搜索了下,大致瞭解裏面的緣由:在handler對象生成時,它將和主線程Looper對象的消息隊列相關聯,消息隊列中的消息將會持有一個對Handler的引用,且Handler作爲內部類將持有外部類的一個引用(參見java內部類的講解,其中內部類可以訪問外部類的private成員,就是因爲其持有外部類的一個引用),當外部類生命週期結束時候,其上下文由於被引用而不能GC,導致資源泄漏。當聲明成靜態內部類時,將不會持有外部類的引用。如果要訪問外部類的話可以使用弱應用。改進後的代碼如下:
static class MyHandler extends Handler{
WeakReference<MainActivity>mActivity;
MyHandler(MainActivity act){
mActivity = new WeakReference<MainActivity>(act);
}
@Override
public void handleMessage(Message msg) {
MainActivity MA = mActivity.get();
//do some code
super.handleMessage(msg);
}
}
如有錯誤,敬請指正,謝謝!