AndroidでHandlerを使って定期的に処理する

Handlerクラスは、インスタンスを作成したスレッドでメッセージに応答する仕組み。

別スレッドからGUIを操作するような時にも使われるクラス。


sendMessageDelayedメソッドで指定時間後にメッセージを送ってもらう事が出来て、

handleMessageメソッドをオーバーライドする事でメッセージに応答できる。


メッセージに応答して時点でまた、sendMessageDelayedを呼んであげれば、一定時間置きに処理を行う事が出来る。

※仕組み上正確な時間を期待すべきはない。たぶん。

※間に重たい処理が入った時は予定より遅れるて応答する事になる。たぶん。



以下、3秒置きにトーストを表示するサンプル。

Handlerを継承したクラスを作り、handlerMessageメソッドをオーバーライドする。

ループ表示の開始と停止をする為のメソッドを用意した。

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;


public class TestHandler extends Handler {
    private Context mContext;

    public TestHandler() {
        mContext = null;
    }

    public void start(Context context) {
        mContext = context;
        sendMessage(obtainMessage(0));
    }

    public void stop() {
        mContext = null;
    }

    @Override
    public void handleMessage(Message msg) {
        if (null == mContext) return;
        Toast.makeText(mContext, "TEST", Toast.LENGTH_SHORT).show();
        //3000ミリ秒後にメッセージを送信
        sendMessageDelayed(obtainMessage(0), 3000);
    }
}

 

Activityを表示中の時のみトースト表示させる為、onResumeでループを開始し、onPauseで停止している。

public class MainActivity extends Activity {
    private TestHandler mTestHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTestHandler = new TestHandler();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mTestHandler.start(this);
    }

    @Override
    protected void onPause() {
        mTestHandler.stop();
        super.onPause();
    }
}