Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当我从处理程序调用非静态方法时,如何使处理程序保持静态以避免泄漏?_Android_Memory Leaks_Static_Handler - Fatal编程技术网

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

Android 当我从处理程序调用非静态方法时,如何使处理程序保持静态以避免泄漏?,android,memory-leaks,static,handler,Android,Memory Leaks,Static,Handler,所以我有一个服务,它通过蓝牙与一些硬件进行通信。服务包含用于从活动接收消息的处理程序。此消息是服务操作的命令/说明。处理程序的定义如下: class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg){ case: blahblah ....

所以我有一个服务,它通过蓝牙与一些硬件进行通信。服务包含用于从活动接收消息的处理程序。此消息是服务操作的命令/说明。处理程序的定义如下:

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

            switch (msg){
            case: blahblah ....
               break;
            case: blahblah ....
               break;
            }
  }
}
实际上,一切都正常工作,但lint警告我可能会发生泄漏,我应该让这个处理器保持静态

此处理程序类应该是静态的,否则可能会发生泄漏。 问题:确保处理程序类不保留对外部对象的引用 类Id:HandlerLeak在Android中,处理程序类应该是静态的或 可能发生泄漏。消息在应用程序线程的 MessageQueue还保留其目标处理程序。如果处理程序是 内部类,其外部类也将保留。避 泄漏外部类,将处理程序声明为静态嵌套类 对它的外层阶级有一个软弱的参照

我的问题是,我不能简单地使处理程序是静态的,因为我调用的是非静态方法,这取决于服务的消息。一些方法正在调用其他方法,并且有很多方法,所以我不可能需要将它们全部设置为静态,不是吗


在这里,我需要更多经验丰富的开发者的建议。如何解决这个问题?谢谢

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

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

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

将弱引用添加到外部类
{
    @Override
    public void handleMessage (Message msg){
    }
}