4

以下是安全的事情。它确实很方便,但是 Handler 可以在可运行对象运行之前收集垃圾吗?

public void dodelayed()
{
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run()
        {
            //do something
        }
    }, 50);
}
4

1 回答 1

9

不,它不是GCed。这样做很好。

稍微长一点的解释,以避免混淆:

尽管您不存储对处理程序的引用,但它存储在其他地方。在从内部调用的方法sendMessageAtTimepostDelayed中,在 Handler 将消息放入消息队列之前,它在消息的target字段中赋值,所以仍然有 Handler 的引用,并且没有被 GC:

public boolean sendMessageAtTime(Message msg, long uptimeMillis)
{
    //...
    if (queue != null) 
    {
        msg.target = this; // here the reference to the handler is assigned 
        sent = queue.enqueueMessage(msg, uptimeMillis);
    }
    //...
}
于 2012-04-30T23:09:48.100 回答