課題
Androidで一定の間隔をおいて定期的に処理を実行する。
方法
1.Handler#postDelayed()を使う方法
2.Handler#sendMessageDelayed()を使う方法
3.Threadを使う方法
(TimerTaskとかAlarmManagerってのでもできるっぽいけどやらない)
1 Handler ------>> postDelayed() 方法
package com.shixinzhu.android;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
/**
* 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;
}
}
2: Message ------> sendMessageDelayed()
package com.shixinzhu.android;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
/**
* 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;
}
}
3: Thread ------>> sleep
package com.shixinzhu.android;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
/**
* 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;
}
}