这个处理程序类应该是静态的或可能发生的泄漏:最后的处理程序(This Handler class s

2019-08-03 02:38发布

在下面的代码Eclipse中生成警告“这个处理程序类应该是静态的或可能发生的泄漏”。

public class MyActivity extends Activity implements Runnable
 {
   final Handler handler = new Handler()
    {
      @Override
      public void handleMessage( Message message)
       {
         String sResult = (String) message.obj;
         if( (sResult != null) && (sResult != ""))
           {
             MyNonStatic = (TableLayout) findViewById( R.id.tableLayout); // any non-static method
           }
         return;
       }
    };


   public void run()
    {
      final Message message = handler.obtainMessage( 1, MyFunction( context));
      handler.sendMessage( message);
    }

   public String MyFunction( Context context)
    {
      return "MyNewString";
    }
  }

我查看现场许多议题,但没有得到解决。 请帮我这个代码?

补充:我需要调用非静态方法(例如findViewById())中的handleMessage()!

Answer 1:

下面是一个使用弱引用和静态处理程序类的皮棉文档中建议解决这个问题的一个例子:

public class MyClass{

  //static inner class doesn't hold an implicit reference to the outer class
  private static class MyHandler extends Handler {
    //Using a weak reference means you won't prevent garbage collection
    private final WeakReference<MyClass> myClassWeakReference; 

    public MyHandler(MyClass myClassInstance) {
      myClassWeakReference = new WeakReference<MyClass>(myClassInstance);
    }

    @Override
    public void handleMessage(Message msg) {
      MyClass myClass = myClassWeakReference.get();
      if (myClass != null) {
        ...do work here...
      }
    }
  }

  private final MyHandler mHandler = new MyHandler(this);

  public MyHandler getHandler() {
    return new MyHandler(this);
  }
}


Answer 2:

处理器 -处理器,对在其回调应该发生的线程。 如果为null,则回调会发生从进程的线程池。

试想一下情况。 有些活动要求PendingIntent.send(...)并把non-static inner subclass of Handler 。 然后活性被破坏。 但内部类的生活

内部类仍持有链接破坏活动,它不能被垃圾收集。

因此,你需要使它静态的。

来源: Android中处理程序和内存泄漏



Answer 3:

从Android的皮棉检查 :

HandlerLeak
-----------
Summary: Ensures that Handler classes do not hold on to a reference to an
outer class

Priority: 4 / 10
Severity: Warning
Category: Performance

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.

该警告的第一部分是因为final Handler handler = new Handler()创建一个匿名内部类。 内部类不能在一个独立的方式来创建,你总是需要外部的实例。 请记住,你将如何在Java中创建这个OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 。 每一个内部类对象还必须保持对外部对象的引用Outer.this访问外部的成员。

第二部分是final Message message = handler.obtainMessage( 1, MyFunction( context)); 具有把手您的内部处理类(其具有处理程序以外的活动类)。 如果此消息活得足够长,它不会是可能的垃圾回收您的活动。

什么可以阻止你的消息被处理? 不幸的是皮棉工具不能明白这一点,所以它总是发出警告,可能存在内存泄漏。 如果你确信你在做什么,你可以通过抑制这些消息的各种方法 。

为了您的情况下,它看起来并不像一个好主意,使Activity一个Runnable ,但无论如何可能是你应该使用Handler.post或最佳Activity.runOnUIThread 。



文章来源: This Handler class should be static or leaks might occur: final Handler