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階層を作成し、その上でメソッドを呼び出すことができるというメッセージが表示されます。私は正確に何が間違っているのか混乱しています。
azertitiが正しい
http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)は、 'のsendMessage()'の代わりに 'のhandleMessage()'を呼び出す必要があります。あなたのUIスレッドで何かが起きるようにするには、そこからメソッドを呼び出す必要があります。ハンドラは、UIスレッドハンドラにメッセージを最初に送信した場合、それを行います。あなたのバックグラウンドスレッドから直接呼び出すと、それはバックグラウンドスレッドで実行され、そこから実行されるすべてのものも同様に実行されます。 – zapl
さて、私は間違いを理解しています。 runOnUiThreadメソッドを使用する場合は、私の実行可能ファイルを取るUiメソッドから呼び出すでしょうか?私の懸念は、ループが連続しているのでUiスレッドに干渉することでしょうか? – jmh
runOnUiThreadを使用すると、渡された実行可能ファイルは別のスレッドで実行されます。 UIスレッドに干渉はありません。 – azertiti