2012-04-30 2 views

答えて

8

いいえ、それは、 GCedではありません。このようにしても問題ありません。

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

あなたはハンドラへの参照を格納しませんが、それはどこか別の場所に保存されています。 postDelayedから呼び出されるメソッドsendMessageAtTimeでは、ハンドラがメッセージをメッセージキューに入れる前に、メッセージのtargetフィールドに自身を割り当てます。したがって、ハンドラへの参照がまだあり、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); 
    } 
    //... 
} 
+0

OPは、「Handler」*自体がガベージコレクションされているかどうかを確認しています。これを防ぐハンドラー自体は何も見ません。 – CommonsWare

+2

@CommonsWare - http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/os/Handler.java#Handler.sendMessageAtFrontOfQueueをご覧ください投稿から遅れて呼び出された%28android.os.Message%29。ハンドラの参照はメッセージ自体に格納されるため、この参照が削除されるか、メッセージ自体がGCされるまでガベージコレクションされません。 – MByD

+0

ああ、それは 'postDelayed()'と結びついています。 OK、それは理にかなっています - ありがとう! – CommonsWare

関連する問題