This Handler class should be static or leaks may occur (null)
'class'这条消息是否在这里引用'MyActivity',因为Handler是一个对象,我确实将它声明为静态。我应该忽略它还是应该添加一些内容,例如'MyActivity'声明中的'static'(我试过这个并且出错了)。我注意到这种棉绒警告经常建议使用'WeakReference'。
public class MyActivity extends Activity{
...
static Handler handler;
...
handler = new Handler()
{
public void handleMessage(Message msg) {
答案 0 :(得分:24)
因为Handler是一个对象,我确实声明它是静态的
您声明数据成员是静态的。但是,您使用的是匿名内部类,因此PyTables
的子类不是Handler
。
而不是:
static
使用:
handler = new Handler() {
public void handleMessage(Message msg) {
// do cool stuff
}
};
其中handler=new MyVeryOwnHandler();
是常规Java类或MyVeryOwnHandler
内部类:
static
请注意,错误是类需要为private static class MyVeryOwnHandler extends Handler {
public void handleMessage(Message msg) {
// do cool stuff
}
};
;它没有说对象需要static
。
答案 1 :(得分:3)
为了避免泄漏,我还迁移到静态嵌套类。 Android Studio的解释说明了这一点,它可能有所帮助:
由于此Handler被声明为内部类,因此可能会阻止 外部阶级被垃圾收集。 如果处理程序正在使用 然后,Looper或MessageQueue用于主线程以外的线程 没有问题。如果Handler正在使用Looper或MessageQueue 在主线程中,你需要修复你的Handler声明,如 如下:将Handler声明为静态类;在外层, 将WeakReference实例化到外部类并将此对象传递给 实例化Handler时的Handler;进行所有引用 使用WeakReference对象的外部类的成员。
在迁移之前,我使用了developer.android.com建议的Looper线程的实现,最终导致了警告。 *划痕
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}