[Android]指定した時間後にちょっとした処理を行う方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

◯秒後に処理を行いたい

最近ひさびさにAndroidにさわり、タイトルのような処理を行う必要があったので備忘録。
Alarmmanagerを使えば指定した時間に処理を行うこともできますが、そういう大げさなものでなく、
「1秒後に画像を切り替えたい」とか、そういう要件に使用します。
こういうときはHandlerクラスのpostDelayedを呼べば実現可能です。
postDelayedは次のように使用します。

new Handler().postDelayed( <Runnableオブジェクト>, <処理を呼び出すまでの時間(ミリ秒)>); 

実行されるRunnableオブジェクトは次のように定義します。

private final Runnable func= new Runnable() {
    @Override
    public void run() {
        //ここに実行したい処理を記述
    }
};

環境

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.4
  • Android OS : 4.1.1

カウントアップのサンプルを作成

では、画面のテキストをカウントアップしていくサンプルを作ってみましょう。
EclipseからAndroid Projectを作成して、layout/activity_main.xmlをちょっとだけ修正します。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0" />

</RelativeLayout>

そして、Activityを次のように修正します。

/** スレッドUI操作用ハンドラ */
private Handler mHandler = new Handler();
/** テキストオブジェクト */
private Runnable updateText;
	
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	updateText = new Runnable() {
		public void run() {
			TextView text = (TextView) findViewById(R.id.count);
			Integer count = Integer.valueOf(text.getText().toString());
			count += 1;
			text.setText(count.toString());
			mHandler.removeCallbacks(updateText);
			mHandler.postDelayed(updateText, 1000);
		}
	};
	mHandler.postDelayed(updateText, 1000);
}

上記Activityでは、1秒後にpostDelayedを呼び出しています。
Runnableオブジェクトのrunメソッド内ではTextViewの値をカウントアップして再度postDelayedを呼び出しています。
アプリケーションを実行してみると、1秒毎にrunメソッドが実行されてTextViewの値がカウントアップされています。