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

原创 287865  2019-08-28 00:00 

我正在开发一个带有服务的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

这是什么意思?

最佳答案:


]

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

handler [ 123]同一个线程的对象都共享一个共同的looper对象,它们将消息发送到该对象并从中读取。

由于消息包含目标

handler ,只要消息队列中存在带有目标处理程序的消息,就不能对处理程序进行垃圾回收。如果处理程序不是静态的,你的 service 或者 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);
         }
    }
}
  参见

帖子

由罗曼家伙作进一步参考

本文地址:https://www.hedasudi.com/3465.shtml
版权声明:本文为原创文章,版权归 287865 所有,欢迎分享本文,转载请保留出处!

发表评论


表情