所以我有一项通过蓝牙与某些硬件进行通信的服务。 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静态,因为我根据哪个消息来服务而调用非静态方法。有些方法正在调用其他方法,并且有很多方法因此我不可能将它们全部静态化,不是吗?
在这里,我需要更有经验的开发人员的建议。如何解决这个问题?感谢
答案 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){
}
}