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