2012-04-03 18 views
3

メッセージを受信して​​いるスレッドハンドラに問題があります。このパターンを実装した他のすべてのスレッドはうまく動作します。ここに私のコード:Androidスレッドハンドラがメッセージを受信して​​いません

スタートスレッド

InternalScoresThread t = new InternalScoresThread(
    this.game.getApplicationContext(), 
    this.map.fileName, this.map.getCurrentTime(), 
    new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 

      Log.d("DEBUG", "message received"); 

      if (msg.getData().getBoolean("record")) { 

       Player.this.showtRecordMessage(); 

      } else { 

       Player.this.showtFinishMessage(); 
      } 

      Player.this.showTimeMessage(); 
      Player.this.showRestartMessage(); 
     } 
}); 

t.start(); 

public class InternalScoresThread extends Thread { 

    private Handler handler; 
    private String map; 
    private float time; 
    private Context context; 

    public InternalScoresThread(Context context, String map, float time, Handler handler) { 

     this.context = context; 
     this.handler = handler; 
     this.map = map; 
     this.time = time; 
    } 

    @Override 
    public void run() {   

     Log.d("DEBUG", "thread started"); 

     Database db = Database.getInstance(this.context); 
     float bestTime = db.getBestTime(this.map); 
     db.addRace(this.map, this.time); 

     Log.d("DEBUG", "race added"); 

     Message msg = new Message(); 
     Bundle b = new Bundle(); 
     b.putBoolean("record", this.time < bestTime || bestTime == 0); 
     msg.setData(b); 
     this.handler.sendMessage(msg); 

     Log.d("DEBUG", "message sent"); 
    } 
} 

「スレッドが起動は、 "レースは追加Threadクラス" と "送信されたメッセージは、" ログは、logcatに表示されますが、ハンドラで "メッセージを受け取った"ではありません。

答えて

6

よく、私はなぜか、しかしdispatchMessage()inste sendMessage()の広告は問題を解決しました...

+0

これはどうして起こったのか他の説明はありますか?私はこの問題を約50%の時間に見ています – JuJoDi

+1

dispatchMessage()はhandleMessage()を同じスレッドで直接呼び出すため、スレッド間の通信の問題を実際には解決しません。 – Memetic

1

私はこれは古い質問ですが、Googleです。

問題は、UIスレッドでハンドラを作成したことです。その後、そのスレッドでメッセージを受信します。新しいスレッドにハンドラを作成する必要があります。

public void run() { 
    Log.d("DEBUG", "creating Handler in thread " + Thread.currentThread().getId()); 
    Looper.prepare(); 
    handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      Log.d("DEBUG", "message received"); 
     } 
    }; 
    Looper.loop(); 
+0

それはなぜ問題なのですか?彼はUIを更新しなければならないので、UIスレッドでハンドラが必要です。 –

+1

おそらく私の答えはより良い言葉にされている可能性があります。要点は、同じスレッドでメッセージを送受信していることです。ハンドラは新しいスレッドをリッスンしていませんが、それを作成した古いスレッド(後でメッセージを送信します)でリッスンしています。私は彼が新しいスレッドにメッセージを送信しようとしていると確信しています。 – Memetic

関連する問題