2011年2月19日土曜日

Android TimerHandler

postDelayed の機構が理解できたという訳で、TimerHandler クラスを作成してみました。ネーミングはちょっといまいちかも?

  2011/2/20 に nextPost() に重要な修正が入ってます

import android.os.Handler;
import android.util.Log;

public class TimerHandler {
  private static final String TAG = "TimerHandler";
  private static final boolean DEBUG_ON = true;
  private Handler handler_;
  private Runnable timeRunner_;
  private Runnable intervalRunner_;
  private long intervalMillisecs_;

  private void nextPost() {
    if(DEBUG_ON) Log.d(TAG,"nextPost");
    // ここでの実行する順序は重要。先にポストしておかないと、
    // timeRunner_ 中から stopTimer(); が呼び出せない。
    handler_.postDelayed( intervalRunner_, intervalMillisecs_);
    timeRunner_.run();
  }

  public void startTimer() {
    if(DEBUG_ON) Log.d(TAG,"startTimer");
    handler_.removeCallbacks(intervalRunner_);
    handler_.postDelayed(
    intervalRunner_,
    intervalMillisecs_ );
  }

  public void stopTimer() {
    if(DEBUG_ON) Log.d(TAG,"stopTimer");
    handler_.removeCallbacks(intervalRunner_);
  }

  TimerHandler(
    Runnable timeRunner,
    long intervalMillisecs
  ) {
    if(DEBUG_ON) Log.d(TAG,"TimerHandler");
    handler_ = new Handler();
    timeRunner_ = timeRunner;
    intervalMillisecs_ = intervalMillisecs;
    intervalRunner_ = new Runnable() { public void run() { nextPost(); } };
  }
}


使い方は、こんなんです。
class Hoge extends Activity {
  private final String TAG = "Hoge";
  private TimerHandler timerHandler_;
  //...
  boolean bTimer = false;
  private void onTimer() {
    Log.d(TAG,"onTimer");
    bTimer = !bTimer;
    if( bTimer ) Toast.makeText(this, "○",Toast.LENGTH_SHORT).show();
    else Toast.makeText(this, "×",Toast.LENGTH_SHORT).show();
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    timerHandler_ = new TimerHandler( new Runnable() { public void run() { onTimer(); }}, 3000 );
  }

  @Override
  protected void onPause() {
    timerHandler_.stopTimer();
    super.onPause();
  }

  @Override
  protected void onResume() {
    timerHandler_.startTimer();
    super.onResume();
  }

  @Override
  protected void onDestroy() {
    // 念のために呼び出ししておかないと、ハンドラが残ったままゾンビ化する
    // onDestroy で、メッセージキューのクリーンアップ処理とかが
    // まともに実行されていないくさい。
    timerHandler_.stopTimer();
    super.onDestroy();
  }
  //...
}

0 件のコメント: