2011/2/20 に nextPost() に重要な修正が入ってます
2025/6/4 に API 30 Handler のコンストラクタに変更が入りました。
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
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");
if( Build.VERSION.SDK_INT < 30) {
handler_ = new Handler();
}
else {
handler_ = new Handler(Looper.getMainLooper());
}
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 件のコメント:
コメントを投稿