在调用runnable之前,具有postDelayed的本地Handler是否会收集垃圾

时间:2012-04-30 23:08:06

标签: java android

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

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

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

1 个答案:

答案 0 :(得分:8)

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

稍微解释一下,以避免混淆:

虽然您没有存储对处理程序的引用,但它存储在其他位置。在从postDelayed内部调用的方法sendMessageAtTime中,在处理程序将消息放入消息队列之前,它将自己分配到消息的target字段中,因此仍然存在对Handler的引用,它不是GCed:

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