这个 Handler 类应该是静态的,否则可能会发生泄漏:IncomingHandler [英] This Handler class should be static or leaks might occur: IncomingHandler

查看:40
本文介绍了这个 Handler 类应该是静态的,否则可能会发生泄漏:IncomingHandler的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

公共类UDPListenerService扩展服务{私有静态最终字符串标记 = "UDPListenerService";//私有线程组 myThreads = new ThreadGroup("UDPListenerServiceWorker");私有 UDPListenerThread myThread;/*** 处理从 WorkerThread 到服务的通信.*/私人处理程序 mServiceHandler;//用于接收来自Activity的消息最终 Messenger inMessenger = new Messenger(new IncomingHandler());//用于向Activity发送消息私人信使 outMessenger;类 IncomingHandler 扩展 Handler{@覆盖公共无效handleMessage(消息消息){}}/*** 我们为客户端发布的目标以向传入处理程序发送消息.*/最终 Messenger mMessenger = new Messenger(new IncomingHandler());[...]}

在这里,final Messenger mMessenger = new Messenger(new IncomingHandler());,我收到以下 Lint 警告:

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

什么意思?

解决方案

如果 IncomingHandler 类不是静态的,它将引用您的 Service 对象.同一线程的

Handler 对象都共享一个公共的 Looper 对象,它们向其发送消息并从中读取消息.

由于消息包含目标Handler,只要消息队列中有带有目标处理器的消息,处理器就不能被垃圾回收.如果 handler 不是静态的,你的 ServiceActivity 不能被垃圾回收,即使在被销毁之后也是如此.

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

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

static class IncomingHandler extends Handler {私有最终 WeakReference移动服务;IncomingHandler(UDPListenerService 服务){mService = new WeakReference(service);}@覆盖公共无效handleMessage(消息消息){UDPListenerService 服务 = mService.get();如果(服务!= null){service.handleMessage(msg);}}}

请参阅 Romain Guy 的 帖子以进一步参考

I'm developing an Android 2.3.3 application with a service. I have this inside that service to communicate with Main 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());
    [ ... ]
}

And here, final Messenger mMessenger = new Messenger(new IncomingHandler());, I get the following Lint warning:

This Handler class should be static or leaks might occur: IncomingHandler

What does it mean?

解决方案

If IncomingHandler class is not static, it will have a reference to your Service object.

Handler objects for the same thread all share a common Looper object, which they post messages to and read from.

As messages contain target Handler, as long as there are messages with target handler in the message queue, the handler cannot be garbage collected. If handler is not static, your Service or Activity cannot be garbage collected, even after being destroyed.

This may lead to memory leaks, for some time at least - as long as the messages stay int the queue. This is not much of an issue unless you post long delayed messages.

You can make IncomingHandler static and have a WeakReference to your service:

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);
         }
    }
}

See this post by Romain Guy for further reference

这篇关于这个 Handler 类应该是静态的,否则可能会发生泄漏:IncomingHandler的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆