4

次のことを行うのは安全ですか。確かに便利ですが、ランナブルが実行される前にハンドラーでガベージ コレクションを取得できますか?

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

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

1 に答える 1

9

いいえ、GCedではありません。このようにすれば大丈夫です。

混乱を避けるために、少し長い説明:

ハンドラーへの参照は保存しませんが、別の場所に保存されます。内部から呼び出されるメソッドsendMessageAtTimepostDelayedでは、ハンドラーがメッセージをメッセージ キューに入れる前に、メッセージのtargetフィールドに自分自身を割り当てるため、ハンドラーへの参照がまだあり、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 に答える