關於This Handler class should be static or leaks might occur的解決辦法

今天在使用定時器的時候使用到了Handler,且使用如下
 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);
        }
    }

如有錯誤,敬請指正,謝謝!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章