gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:50:29 25 4
gpt4 key购买 nike

我正在开发一个带有服务的 Android 2.3.3 应用程序。我在该服务中有这个与主要 Activity 进行通信:

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());,我收到以下 Lint 警告:

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

什么意思?

最佳答案

如果 IncomingHandler 类不是静态的,它将引用您的 Service 对象。

同一线程的

Handler 对象都共享一个公共(public) Looper 对象,它们向该对象发送消息并从中读取。

由于消息中包含targetHandler,只要消息队列中有带有target handler的消息,该handler就不能被垃圾回收。如果处理程序不是静态的,则您的 ServiceActivity 不能被垃圾回收,即使在被销毁后也是如此。

这可能会导致内存泄漏,至少在一段时间内 - 只要消息留在队列中。除非您发布长时间延迟的消息,否则这不是什么大问题。

您可以将 IncomingHandler 设为静态,并为您的服务添加一个 WeakReference:

static class IncomingHandler extends Handler {
private final WeakReference<UDPListenerService> mService;

IncomingHandler(UDPListenerService service) {
mService = new WeakReference<UDPListenerService>(service);
}
@Override
public void handleMessage(Message msg)
{
UDPListenerService service = mService.get();
if (service != null) {
service.handleMessage(msg);
}
}
}

查看 post Romain Guy 供进一步引用

关于android - 这个 Handler 类应该是静态的,否则可能会发生泄漏 : IncomingHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11407943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com