handler.post(runnable);
をいつ使うべきか、いつnew Thread(runnable).start();
を使うべきか疑問に思っています
ハンドラーの開発者向けドキュメントに記載されています。
Runnable rをメッセージキューに追加します。実行可能ファイルは、このハンドラーが接続されているスレッドで実行されます。
これは、Activity
クラスのonCreate()
に書き込む場合を意味します。
Handler handler = new Handler();
handler.post(runnable);
runnableは別のスレッドまたはActivityのスレッドで呼び出されますか?
UIスレッドで操作を行う場合は、Handler.post()
を使用する必要があります。
したがって、コールバック(別のスレッドで実行されている)でTextView
のテキストを変更する場合、Handler.post()
を使用する必要があります。
Androidでは、他の多くのUIフレームワークと同様に、UI要素(ウィジェット)はメインスレッドからのみ変更できます。
編集:長時間実行されるタスクの例
mHandler = new Handler();
new Thread(new Runnable() {
@Override
public void run () {
// Perform long-running task here
// (like audio buffering).
// you may want to update some progress
// bar every second, so use handler:
mHandler.post(new Runnable() {
@Override
public void run () {
// make operation on UI - on example
// on progress bar.
}
});
}
}).start();
もちろん、実行したいタスクが非常に長く、その間にユーザーが別のアプリに切り替えるリスクがある場合は、 Service の使用を検討する必要があります。
特定の質問に答えるには:
これは、アクティビティクラスのonCreateで次のように記述した場合に意味しますか。
Handler handler = new Handler()hanlder.post(runnable);それから、runnableは別のスレッドまたはActivityのスレッドで呼び出されますか?
いいえ、ありません。 Runnableは、メインスレッド自体で呼び出されます。ハンドラは、メッセージが添付されたスレッド(メッセージが作成された場所)にメッセージを投稿するために使用されます。独自のスレッドは作成しません。この例では、メインスレッド(Activity.OnCreate()が呼び出される)でハンドラーを作成したため、そのようなハンドラーに投稿されたメッセージはメインスレッドでのみ実行されます。
例はジャッキです:
mHandler = new Handler();
new Thread(new Runnable(){
@Override
public void run () {
mHandler.post(new Runnable() {
@Override
public void run () {
mUiView.setX(x);
}
});
}
}).start();
または、ハンドラーをスキップして、ビューで直接postメソッドを使用できます。
new Thread(new Runnable(){
@Override
public void run () {
mUiView.post(new Runnable() {
@Override
public void run () {
mUiView.setX(x);
}
});
}
}).start();
これは、違いを概説する良い投稿です: postメソッドは正確に何をしますか?
postコード(通常バックグラウンドスレッドから)にしたい場合はhandler.post()
を使用しますメインスレッド。いや、あなたと同じように、誰かに手紙を投稿してください。 handlerの助けを借りて、コードはできるだけ早く、つまりほぼ即座に実行されます。