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