課題
Androidで一定の間隔をおいて定期的に処理を実行する。
方法
1.Handler#postDelayed()を使う方法
2.Handler#sendMessageDelayed()を使う方法
3.Threadを使う方法
(TimerTaskとかAlarmManagerってのでもできるっぽいけどやらない)
Handler#postDelayed()を使う方法
postDelayed()を使って一定間隔ごとにRunnableを起動させる
/**
* 1.初回実行
* 2.繰り返し
* 3.次回処理をセット(Handler#postAtTime()でも代用可)
* 4.停止
*/
public class RepeatByPost extends Activity {
//繰り返し間隔(ミリ秒)
private final int REPEAT_INTERVAL = 3000;
private Handler handler = new Handler();
private Runnable runnable;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
runnable = new Runnable() {
@Override
public void run() {
//2.繰り返し処理
doSomething();
//3.次回処理をセット
handler.postDelayed(this, REPEAT_INTERVAL);
}
};
//1.初回実行
handler.postDelayed(runnable, REPEAT_INTERVAL);
}
private void doSomething() {
Log.i("Repeat by", "post");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i("onTouchEvent()", "STOP");
//4.画面がタッチされたらhandlerからコールバック(runnable)を削除して処理を停止する
handler.removeCallbacks(runnable);
return true;
}
}
Handler#sendMessageDelayed()を使う方法
sendMessageDelayed()を使って一定間隔ごとにMessageを発行し、handleMessage()で受け取る。
/**
* 1.初回実行
* 2.繰り返し判定
* 3.繰り返し処理
* 4.次回処理をセット
* 5.停止処理
*/
public class RepeatBySendMessage extends Activity {
//繰り返し間隔(ミリ秒)
private final int REPEAT_INTERVAL = 3000;
//繰り返し処理を続けるかどうかのフラグ
private boolean isRepeat = true;
//Messageコード(数値は適当)
private final int MESSAGE_WHAT = 100;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//2.isRepeatがtrueなら処理を繰り返す
if (isRepeat) {
//3.繰り返し処理
doSomething();
//4.次回処理をセット
handler.sendMessageDelayed(obtainMessage(), REPEAT_INTERVAL);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Message message = new Message();
message.what = MESSAGE_WHAT;
//1.初回実行
handler.sendMessageDelayed(message, REPEAT_INTERVAL);
}
private void doSomething() {
Log.i("Repeat by", "sendMessage");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i("onTouchEvent()", "STOP");
//5.画面がタッチされたらisRepeatをfalseにして繰り返し処理を停止させる
isRepeat = false;
return true;
}
}
Threadを使う方法
起動させたThreadにsleep()を入れて一定の間隔で処理を実行させる。
/**
* 1.スレッド起動
* 2.繰り返し判定
* 3.繰り返し処理
* 4.停止処理
*/
public class RepeatByThread extends Activity {
//繰り返し間隔(ミリ秒)
private final int REPEAT_INTERVAL = 3000;
//繰り返し処理を続けるかどうかのフラグ
private boolean isRepeat = true;
private Thread thread;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Runnable looper = new Runnable() {
@Override
public void run() {
//2.isRepeatがtrueなら処理を繰り返す
while(isRepeat) {
try {
Thread.sleep(REPEAT_INTERVAL);
} catch (InterruptedException e) {
Log.e("looper", "InterruptedException");
}
//3.繰り返し処理
doSomething();
}
}
};
//1.スレッド起動
thread = new Thread(looper);
thread.start();
}
private void doSomething() {
Log.i("Repeat by", "thread");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i("onTouchEvent()", "STOP");
/*
* 4.画面がタッチされたらisRepeatをfalseにして繰り返し処理を停止させる
* Threadを利用した場合は停止のタイミングがずれることがある
*/
isRepeat = false;
return true;
}
}