アクティビティ オブジェクトがない場合は、ハンドラーを使用できます。クラス「ハンドラー」は、UI を更新できます。ハンドルは、メッセージを受信するためのメソッドと実行可能なメソッドを提供します。ハンドラーを使用するには、ハンドラーをサブクラス化し、handleMessage() をオーバーライドしてメッセージを処理する必要があります。ランナブルを処理するには、メソッド post(); を使用できます。アクティビティに必要なハンドラーのインスタンスは 1 つだけです。
スレッドは、メソッド sendMessage(Message msg) または sendEmptyMessage を介してメッセージを投稿できます。
サンプル例
- ハンドラーの例
この例では、「Handler」クラスを使用して、バックグラウンド スレッドで ProgressBar を更新します。
アクティビティ「ProgressTestActivity」で新しい Android プロジェクト「de.vogella.android.handler」を作成します。次のレイアウト「main.xml」を作成します。このレイアウトには ProgressBar が含まれ、スタイルを介してその外観を設定します。
アクティビティを次のように変更します。
package de.vogella.android.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.ProgressBar;
public class ProgressTestActivity extends Activity {
private Handler handler;
private ProgressBar progress;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
progress = (ProgressBar) findViewById(R.id.progressBar1);
handler = new Handler();
}
public void startProgress(View view) {
// Do something long
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i <= 10; i++) {
final int value = i;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
@Override
public void run() {
progress.setProgress(value);
}
});
}
}
};
new Thread(runnable).start();
}
}
アプリケーションを実行します。ボタンを押すと、ProgressBar がバックグラウンド スレッドから更新されます。
サンプルはhttp://www.vogella.de/articles/AndroidPerformance/article.html#concurrency_handlerからのものです