Android Handle Thread Message 小说明

来源:互联网 发布:泉州广电网络 编辑:程序博客网 时间:2024/04/29 10:49

課題

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

原创粉丝点击