以下是安全的事情。它确实很方便,但Handler可以在runnable运行之前收集垃圾吗?
public void dodelayed()
{
new Handler().postDelayed(new Runnable() {
@Override
public void run()
{
//do something
}
}, 50);
}
答案 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);
}
//...
}