次のことを行うのは安全ですか。確かに便利ですが、ランナブルが実行される前にハンドラーでガベージ コレクションを取得できますか?
public void dodelayed()
{
new Handler().postDelayed(new Runnable() {
@Override
public void run()
{
//do something
}
}, 50);
}
いいえ、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);
}
//...
}