課題
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 件のコメント:
コメントを投稿