72

いつ使うべきなのか、いつ使うhandler.post(runnable);べきなのか気になります new Thread(runnable).start();

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

Runnablerをメッセージキューに追加します。ランナブルは、このハンドラーが接続されているスレッドで実行されます。

onCreate()これは、私がofActivityクラスに書き込む場合を意味しますか?

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

次に、runnableは別のスレッドまたはアクティビティのスレッドで呼び出されますか?

4

4 に答える 4

102

Handler.post()UI スレッドで操作を行う場合はいつでも使用する必要があります。

TextViewでは、コールバックで a のテキストを変更したいとしましょう。コールバックは UI スレッドで実行されていないため、 を使用する必要がありますHandler.post()

Android では、他の多くの UI フレームワークと同様に、UI 要素 (ウィジェット) は 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 a progress
    // bar every second, so use a handler:
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       // make operation on the UI - for example
       // on a progress bar.
     }
    });
  }
}).start();

もちろん、実行したいタスクが非常に長く、その間にユーザーが別のアプリに切り替えるリスクがある場合は、Serviceの使用を検討する必要があります。

于 2013-02-28T13:02:34.773 に答える
12

例はジャックされています:

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

于 2014-01-24T15:02:08.470 に答える