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

2024-04-21

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

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 警告:

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

这是什么意思?


If IncomingHandler类不是静态的,它将引用您的Service object.

Handler同一线程的对象都共享一个公共的 Looper 对象,它们向该对象发送消息并从中读取消息。

由于消息包含目标Handler,只要消息队列中存在带有目标handler的消息,该handler就无法被垃圾回收。如果处理程序不是静态的,您的Service or Activity即使在被销毁之后也不能被垃圾收集。

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

你(们)能做到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 http://groups.google.com/group/android-developers/msg/959f98f16a038694?pli=1罗曼·盖伊 (Romain Guy) 撰写,供进一步参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

该 Handler 类应该是静态的,否则可能会发生泄漏:IncomingHandler 的相关文章

随机推荐