当我从中调用非静态方法时,如何使处理程序静态以避免泄漏?

时间:2013-10-16 12:27:43

标签: android memory-leaks static handler

所以我有一项通过蓝牙与某些硬件进行通信的服务。 Service包含用于从活动接收消息的Handler。此消息是用于服务的命令/指令。处理程序简单定义为:

class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {

            switch (msg){
            case: blahblah ....
               break;
            case: blahblah ....
               break;
            }
  }
}

一切实际上都没有问题但是lint告诉我可能会发生泄漏的警告我应该让这个Handler变得静止......

  

此Handler类应该是静态的,否则可能会发生泄漏。   问题:确保Handler类不会保留对外部的引用   class Id:HandlerLeak在Android中,Handler类应该是静态的或   可能会发生泄漏。消息在应用程序线程上排队   MessageQueue还保留其目标Handler。如果处理程序是一个   内部类,它的外部类也将被保留。避免   泄漏外部类,将Handler声明为静态嵌套类   使用WeakReference到它的外部类。

我的问题是我不能简单地使Handler静态,因为我根据哪个消息来服务而调用非静态方法。有些方法正在调用其他方法,并且有很多方法因此我不可能将它们全部静态化,不是吗?

在这里,我需要更有经验的开发人员的建议。如何解决这个问题?感谢

2 个答案:

答案 0 :(得分:0)

我认为将处理程序设为静态是非常必要的。您可以声明一个'静态类XXXHandler extends Handler',然后处理程序(Message的目标)将不会保留对封闭类的引用。然后它不会泄露。    如果要在Message中传递内容,请将它们放入Message.object中。如果处理程序要处理多个对象,只需将它们放在Object []中,并在要使用它们时使用强制转换。    我之前发现了这样的问题。 :)

答案 1 :(得分:0)

Handler handler = new Handler(Looper.getMainLooper()){...}

您不需要创建Java类,只需创建处理程序并覆盖这些括号之间的handleMessage方法

{
    @Override
    public void handleMessage (Message msg){
    }
}