警告handler leaks的解決方法

發現所有的Handler都被打上了"This Handler class should be static or leaks might occur .."的警告, Google一番後發現瞭解決方法. 


一>, 原因
找到一段E文
Issue: Ensures that Handler classes do not hold on to a reference to an outer class
確保Hanler類不持有外部類的引用
In Android, Handler classes should be static or leaks might occur. Messages enqueued on the application thread's MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class. 
在Android中, Handler類應是static的, 否則可能會發生泄漏. 程序線程的消息隊列的Message也持有對Handler對象的引用. 如果Handler是內部類, 那麼(回收內存時)其外部類也會被保留.(使用Handler的Service和Activity就也無法被回收. 這就可能導致內存泄露.) 爲了避免泄露其外部類, 可將Handler聲明爲static並持有其外部類的WeakReference(弱引用).

二>, 解決方法

上面已經指名了一條王道, 將Handler聲明爲static並持有其外部類的WeakReference(弱引用).

	static class MHandler extends Handler {
		WeakReference<OuterClass> outerClass;

		MHandler(OuterClass activity) {
			outerClass = new WeakReference<OuterClass>(activity);
		}

		@Override
		public void handleMessage(android.os.Message msg) {
			OuterClass theClass = outerClass.get();
			switch (msg.what) {
			case 0: {
				//使用theClass訪問外部類成員和方法
				break;
			}
			default: {
				Log.w(TAG, "未知的Handler Message:" + msg.what);
			}
			}

		}
	}



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