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(); } }
コメントをお書きください