Android開發中使用Handler類造成的內存泄露問題

在Android開發中,經常使用Handler來進行主線程(UI線程)與子線程間的消息傳遞工作,代碼如下:

public class MyActivity extends Activity
{

        Handler mHandler = new Handler()
	{

		@Override
		public void handleMessage(Messagemsg)
                {
                    super.handleMessage(msg);

		{
		
	};


}

但這麼做編譯器會報一個警告:This Handler class should be static or leaks might occur 

意思是Handler應該創建成靜態的,並且使用弱引用,否則可能造成內存泄露。這是由於非靜態內部類會持有外部類對象的引用,而Handler又由於Message處理的方式有可能常駐內存當中。這樣就會導致外部的Activity或者Service在銷燬之後無法及時被GC回收,甚至內存泄漏。
解決辦法是將Handler聲明爲static嵌套類,並且使用對外部類的弱引用。在此,順便說一下什麼是弱引用:在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由於垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。弱引用常用來解決內存泄露問題。
代碼如下:
static class MyHandler extends Handler 
{
                WeakReference<MyActivity> mActivity;
   
                MyHandler(MyActivity activity) 
                {
                        mActivity = new WeakReference<MyActivity>(activity);
                }
   
                @Override
                public void handleMessage(Message msg) {
                        MyActivity activity = mActivity.get();
                        switch (msg.what) {
                        case 0:
                               
                                break;
                        }
                }
}


發佈了33 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章