發現所有的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);
}
}
}
}