My Photo

« スウェットのズボンのゴム交換 | Main | PHPメモ005:配列 »

January 13, 2012

TimerとTimerTaskで一定時間毎に処理をする

Androidで一定時間ごとに同じ処理を繰り返すにはどうするか調べていて、TimerとTimerTaskを使う方法を見つけた。
これらのクラスはAndroid独自のものではなく、Javaの標準ライブラリにあるクラスだった。知らんかった^^;

繰り返し処理だけでなく、Timer#schedule()とTimer#scheduleAtFixedRate()で以下のようなさまざまなパターンのスケジュールを指定できる。

  • 指定時間に1回だけ実行。
  • 指定時間に開始し、「固定遅延実行」を繰り返す。
  • 指定した遅延の後に1回だけ実行。
  • 指定した遅延の後に開始し、「固定遅延実行」を繰り返す。
  • 指定時間に開始し、「固定頻度実行」を繰り返す。
  • 指定した遅延の後に開始し、「固定頻度実行」を繰り返す。
実装は以下のようにする。
  • TimerTaskのサブクラスを実装し、繰り返したい処理をrun()に記述する。
  • Timer#schecuel()に上記のTimerTaskのサブクラスのインスタンス、スケジュールに関するパラメータを渡して呼び出す
schedule()とscheduleAtFixedRate()の違いなど詳細は参考ページを参照。

指定した時間毎にトーストを出すAndroidアプリのコード(抜粋)。
アクティビティのコード。

public class TimerExample2 extends Activity {
  
  private long repeatInterval;  // 繰り返しの間隔(単位:msec)
  
  Timer timer;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    final EditText editText1 = (EditText)findViewById(R.id.editText1);
    
    // タイマー開始ボタンの処理
    Button button1 = (Button)findViewById(R.id.button1);
    button1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        // タイマーをセット
        timer = new Timer();
        TimerTask timerTask = new Task1(TimerExample2.this);
        timer.scheduleAtFixedRate(timerTask, repeatInterval, repeatInterval);
        
        // トーストでタイマー開始を通知
        Toast toast = Toast.makeText(TimerExample2.this, R.string.timer_start, Toast.LENGTH_LONG);
        toast.show();
      }
    });
    
    // タイマー停止ボタンの処理
        Button button2 = (Button)findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        cancelTimer();
      }
    });
  }

  /**
   * 終了処理
   */
  @Override
  protected void onDestroy() {
    super.onDestroy();
    
    cancelTimer();
  }
  
  /**
   * タイマーをキャンセルする。
   */
  private void cancelTimer() {
    if (timer != null) {
      timer.cancel();
    }
  }
}
スレッドのコード
public class Task1 extends TimerTask {
  
  private Handler handler;
  private Context context;
  
  public Task1(Context context) {
    handler = new Handler();
    this.context = context;
  }
  
  @Override
  public void run() {
    // Viewの操作だけじゃなくてトーストを出すのにもHandler使わないといけないのか。。。
    handler.post(new Runnable() {
      @Override
      public void run() {
        // トーストを出す。
        Toast myToast = Toast.makeText(
            context, "Hello, How are you?",
            Toast.LENGTH_SHORT);
        myToast.show();
      }
    });
  }
}

参考ページ: @IT:Java TIPS -- Javaのタスクを定期的に実行する
Androidで周期的な処理をするクラスを作ってみた « 煩悩の確率論
繰り返し処理を行うとき - Android 開発入門
開発の日誌 タイマーの設定

« スウェットのズボンのゴム交換 | Main | PHPメモ005:配列 »

Androidアプリ開発」カテゴリの記事

「Java」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/53728128

Listed below are links to weblogs that reference TimerとTimerTaskで一定時間毎に処理をする:

« スウェットのズボンのゴム交換 | Main | PHPメモ005:配列 »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof