2012-03-19 5 views
1

私は100分の1秒の正確なカスタムクロノメーターを作る方法を見つけようとしています。私は他の同様の質問をたくさん見て、スレッドとハンドラを使って試してみることにしました。UIスレッドで更新されるストップウォッチを作成する

これは私のカスタムのhandleMessage方法である:

public void handleMessage(Message msg) { 
    String timeText = msg.getData().getString("time"); 
    watch.setText(timeText); 
} 

時計のオブジェクトはのonCreateに初期化されたばかりのTextViewです()。

そして、これは私のrunメソッドの主な塊です:

while(true) { 
    long timeElapsed = System.currentTimeMillis() - startTime; 
    int hundreths = (int)((timeElapsed % 1000)/10); 
    int seconds = (int)((timeElapsed % 60000)/1000); 
    int minutes = (int)(timeElapsed/60000); 
    Bundle bundle = new Bundle(); 
    bundle.putString("time", String.format("d:%02d.%02d", minutes, seconds, hundreths)); 
    Message msg = handler.obtainMessage(); 
    msg.setData(bundle); 
    handler.handleMessage(msg); 
} 

私はハンドラを使用して全体の考え方が唯一のUIスレッドは、画面上の要素を更新できるということであることを認識が、私はまだ取得していますCalledFromWrongThreadException。開始された元のスレッドのみがView階層を作成し、その上でメソッドを呼び出すことができるというメッセージが表示されます。私は正確に何が間違っているのか混乱しています。

+0

azertitiが正しい

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)は、 'のsendMessage()'の代わりに 'のhandleMessage()'を呼び出す必要があります。あなたのUIスレッドで何かが起きるようにするには、そこからメソッドを呼び出す必要があります。ハンドラは、UIスレッドハンドラにメッセージを最初に送信した場合、それを行います。あなたのバックグラウンドスレッドから直接呼び出すと、それはバックグラウンドスレッドで実行され、そこから実行されるすべてのものも同様に実行されます。 – zapl

+0

さて、私は間違いを理解しています。 runOnUiThreadメソッドを使用する場合は、私の実行可能ファイルを取るUiメソッドから呼び出すでしょうか?私の懸念は、ループが連続しているのでUiスレッドに干渉することでしょうか? – jmh

+0

runOnUiThreadを使用すると、渡された実行可能ファイルは別のスレッドで実行されます。 UIスレッドに干渉はありません。 – azertiti

答えて

3

あなたのエラーは、sendMessageではなくhandleMessageを使用しているためです。

より簡単な方法は、runOnUiThreadメソッドを使用してハンドラを放棄することです。

関連する問題