此Handler类应该是静态的或可能发生泄漏(null)

时间:2015-06-13 15:12:35

标签: android handler

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) {

2 个答案:

答案 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();
  }  
 }