0

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

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

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

一切实际上都没有问题,但 lint 警告我可能会发生泄漏,我应该让这个 Handler 成为静态的......

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

我的问题是我不能简单地将 Handler 设为静态,因为我正在调用非静态方法,具体取决于服务的消息。有些方法正在调用其他方法,而且它们有很多,所以我不可能将它们全部设为静态,不是吗?

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

4

2 回答 2

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

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

{
    @Override
    public void handleMessage (Message msg){
    }
}
于 2017-02-11T11:46:42.370 回答
0

我认为将处理程序设为静态是非常必要的。您可以声明一个“静态类 XXXHandler 扩展处理程序”,然后处理程序(消息的目标)不会保留对封闭类的引用。然后就不会泄露了。如果你想在 Message 中传递一些东西,那么将它们放入 Message.object 中。如果有多个对象需要处理程序处理,只需将它们放在一个Object[]中,并在需要使用它们时使用强制转换。我以前发现过这样的问题。:)

于 2013-11-11T06:14:22.653 回答