欲求不満の投稿....
多くの人がここで報告している「CountDownTimer - 最後の onTick が呼び出されなかった」という問題に遭遇しました。
問題を示す簡単なデモ
package com.example.gosh;
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
public class CountDownTimerSucksActivity extends Activity {
int iDontWantThis = 0; // choose 100 and it works yet ...
private static final String TAG = "CountDownTimerSucksActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new MyCountDownTimer(10000 + iDontWantThis , 1000).start();
}
class MyCountDownTimer extends CountDownTimer {
long startSec;
public MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
// TODO Auto-generated constructor stub
startSec = System.currentTimeMillis() ;
}
@Override
public void onFinish() {
// TODO Auto-generated method stub
Log.e(TAG, " onFinish (" + getSeconds() + ")");
}
@Override
public void onTick(long millisUntilFinished) {
// TODO Auto-generated method stub
Log.e(TAG, millisUntilFinished + " millisUntilFinished" + " (" + getSeconds() + ")");
}
protected long getSeconds() {
return (((System.currentTimeMillis() - startSec) / 1000) % 60);
}
}
}
テスト実行からのlogcat出力...
最後の呼び出し onTick が 1963ms millisUntilFinished で発生していることがわかります。次の呼び出しはほぼ 2 秒後に onFinished です。確かにバギーな振る舞い。これに関する多くの投稿を見つけましたが、まだクリーンなソリューションはありません。iDontWantThis フィールドを 100 に設定すると、ソース コードに含めた 1 つが機能します。
マイナーな分野での回避策は気にしませんが、これはコア機能のようで、まだ修正されていないとは言えません。これに対する明確な解決策を得るために、あなたは何をしていますか?
どうもありがとう
マーティン
アップデート:
内部のミリ秒遅延のために最後のティックを抑圧せず、時間の経過とともに各ティックでのミリ秒遅延の蓄積を防止する Sam による CountDownTimer の非常に便利な変更は、ここにあります。