当前位置: 首页 > 知识库问答 >
问题:

此处理程序类应该是静态的,否则可能发生泄漏:IncomingHandler

拓拔弘厚
2023-03-14

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

此处理程序类应该是静态的,否则可能发生泄漏:IncomingHandler

共有1个答案

索嘉胜
2023-03-14

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

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

由于消息包含目标处理程序,因此只要消息队列中有带有目标处理程序的消息,就不能垃圾回收处理程序。如果处理程序不是静态的,则无法对服务活动进行垃圾回收,即使在销毁之后也是如此。

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);
         }
    }
}
 类似资料:
  • 这是我的代码: 我怎么纠正这个?

  • 我的项目中有一个AsyncTask,有一个警告,它说:

  • 此AsyncTask类应该是静态的,否则可能发生泄漏(匿名Android.os.AsyncTask) 该警告是由于内部类持有对外部类的隐式引用,因此阻止外部类进行GC。解决方案在于警告本身,即该类应该声明为静态的。 但是,解决方案是java特有的。鉴于kotlin没有修饰符,最接近的是companion object,而companion object确实包含对它的“外部类”的引用。

  • 问题内容: 假设我有一个实用程序类DateUtil(请参见下文)。若要使用此方法,调用者方法将使用DateUtils.getDateAsString(aDate)。删除static修饰符并使DateUtil成为spring bean(请参见DateUtilsBean)并将其注入到调用类中还是将其保持原样会更好吗? 春豆版本 问题答案: 我不这么认为。DateUtils类听起来像是一个纯实用程序类,

  • 问题内容: 假设您有以下代码: 重用ps变量是否有潜在的泄漏? 如果是这样,我不希望声明多个此类准备好的语句(ps1,ps2,ps3等)。我应该如何重构呢? 有人在想吗? 编辑 收到几个答案,说明这无关紧要。我想指出的是,我遇到的游标保持打开状态的时间过长,并且想知道该模式是否与此有关。 我的想法是: 第一条语句被取消引用并进行了GC处理,因此在此示例中,如何关闭第一个PreparedStatem

  • 我正在尝试运行这个简单的类,并且对于每个cicle,我正在计算java进程线程的数量。 ps huH p pid wc-l。 对于每个cicle,线程数是availableProcessors()数的增加。 当ExecutorService在其他线程中运行时,garbace收集器似乎不会释放僵尸线程。 如果我创建了一个静态ExecutorService,它就不会发生