2011年10月13日木曜日

Androidで定期的に処理を実行する方法

課題
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;
}
}

0 件のコメント:

コメントを投稿