为了账号安全,请及时绑定邮箱和手机立即绑定

这个Handler类应该是静态的,否则可能会发生泄漏:IncomingHandler

这个Handler类应该是静态的,否则可能会发生泄漏:IncomingHandler

手掌心 2019-06-29 16:57:32
这个Handler类应该是静态的,否则可能会发生泄漏:IncomingHandler我正在用服务开发一个Android2.3.3应用程序。我在该服务中有一个与主要活动进行沟通的方法:public class UDPListenerService extends Service{     private static final String TAG = "UDPListenerService";     //private ThreadGroup myThreads = new ThreadGroup("UDPListenerServiceWorker");     private UDPListenerThread myThread;     /**      * Handler to communicate from WorkerThread to service.      */     private Handler mServiceHandler;     // Used to receive messages from the Activity     final Messenger inMessenger = new Messenger(new IncomingHandler());     // Use to send message to the Activity     private Messenger outMessenger;     class IncomingHandler extends Handler     {         @Override         public void handleMessage(Message msg)         {         }     }     /**      * Target we publish for clients to send messages to Incoming Handler.      */     final Messenger mMessenger = new Messenger(new IncomingHandler());     [ ... ]}在这里,final Messenger mMessenger = new Messenger(new IncomingHandler());,我收到以下林特警告:This Handler class should be static or leaks might occur: IncomingHandler什么意思?
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

下面是一个使用弱引用和静态处理程序类来解决问题的通用示例(如Lint文档中所建议的):

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...
      }
    }
  }

  /**
   * An example getter to provide it to some external class
   * or just use 'new MyHandler(this)' if you are using it internally.
   * If you only use it internally you might even want it as final member:
   * private final MyHandler mHandler = new MyHandler(this);
   */
  public Handler getHandler() {
    return new MyHandler(this);
  }}


查看完整回答
反对 回复 2019-06-29
  • 3 回答
  • 0 关注
  • 521 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信