web-dev-qa-db-ja.com

handler.post()を使用する場合と新しいThread()を使用する場合

handler.post(runnable);をいつ使うべきか、いつnew Thread(runnable).start();を使うべきか疑問に思っています

ハンドラーの開発者向けドキュメントに記載されています。

Runnable rをメッセージキューに追加します。実行可能ファイルは、このハンドラーが接続されているスレッドで実行されます。

これは、ActivityクラスのonCreate()に書き込む場合を意味します。

Handler handler = new Handler();
handler.post(runnable);

runnableは別のスレッドまたはActivityのスレッドで呼び出されますか?

55
reiley

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 の使用を検討する必要があります。

82
kamituel

特定の質問に答えるには:

これは、アクティビティクラスのonCreateで次のように記述した場合に意味しますか。

Handler handler = new Handler()hanlder.post(runnable);それから、runnableは別のスレッドまたはActivityのスレッドで呼び出されますか?

いいえ、ありません。 Runnableは、メインスレッド自体で呼び出されます。ハンドラは、メッセージが添付されたスレッド(メッセージが作成された場所)にメッセージを投稿するために使用されます。独自のスレッドは作成しません。この例では、メインスレッド(Activity.OnCreate()が呼び出される)でハンドラーを作成したため、そのようなハンドラーに投稿されたメッセージはメインスレッドでのみ実行されます。

26
pareshgoel

例はジャッキです:

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メソッドは正確に何をしますか?

12
worked

postコード(通常バックグラウンドスレッドから)にしたい場合はhandler.post()を使用しますメインスレッド。いや、あなたと同じように、誰かに手紙を投稿してください。 handlerの助けを借りて、コードはできるだけ早く、つまりほぼ即座に実行されます。

6
user2768308