【发布时间】:2016-08-12 12:24:26
【问题描述】:
我正在编写一些 Activity 代码,但遇到了我不理解的 Android Studio 警告。这是产生警告的代码的最小版本:
package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
public class TestActivity extends Activity {
private static Handler mActivityHandler = new Handler() {
// Android Studio 1.5.1 warns of a leak here
};
protected void onCreate( Bundle state ) {
super.onCreate( state );
mActivityHandler.sendEmptyMessageDelayed( 0, 10L );
}
}
Android Studio 1.5.1 以黄色突出显示注释指示的 new Handler() { } 的正文,并显示以下消息:
处理程序引用泄漏
由于这个 Handler 被声明为一个内部类,它可能会阻止外部类被垃圾回收。如果 Handler 对主线程以外的线程使用 Looper 或 MessageQueue,则没有问题。如果 Handler 使用的是主线程的 Looper 或 MessageQueue,则需要修正你的 Handler 声明,如下: 将 Handler 声明为静态类;在外部类中,对外部类实例化一个WeakReference,并在实例化Handler时将此对象传递给你的Handler;使用 WeakReference 对象对外部类的成员进行所有引用。
代码运行良好(当我为本示例删除的其余代码被放回时!)但我想了解警告并找到修复它的方法。
是否有另一种编写代码的方法来避免此警告?
【问题讨论】:
-
可以在here找到一个很好的解释和修复警告。
-
您的特定示例对我来说很有趣,因为您创建了匿名
Handler的静态实例。我很好奇警告是否真的适用于这种情况,因为您没有对TestActivity.this的隐式引用。 -
解释和建议的补救措施怎么不够?
-
@323go:我相信这个解释对于有经验的 Android 和 Java 开发人员来说已经足够了。但如果我对此感到困惑,我怀疑其他人可能也是。目前,我很高兴能按原样运行代码,即使有警告。但我当然不喜欢这样的警告!所以我发布了这个问题,以防它帮助我的其他人。 :-)