0

CountDownTimer を実装して、0 になるまで視覚的なテキストのカウントダウンを投稿してから、特定のメッセージを送信しようとしています。3 秒になるまではすべて正常に動作し、done() メソッドが 2 回呼び出されます。残り3秒で1回、カウンター終了時に1回。

done() が呼び出されるのは、この CountDownTimer() の onFinish() が呼び出されたときだけだと確信しています。なぜそれが2回、一貫して同時に呼び出されるのか、私にはわかりません。

私のJavaコード:

mainCounter = new CountDownTimer(30000, 1000){
@Override
public void onTick(long millisUntilDone){
    int hours = (int) (millisUntilDone/3600000);
    int mins = 0, secs = 0;
    long timeLeft = millisUntilDone % 3600000;
    if((int)timeLeft != 0){
        mins = (int) (timeLeft/60000);
    }
    long timeLeftStill = timeLeft % 60000;
    if((int)timeLeftStill != 0){
        secs = (int) (timeLeftStill/1000);
    }

    ((TextView)findViewById(R.id.timer_label)).setText("You have " + hours + " hours, " + mins + " mins, " + secs + " secs left");
    }

    @Override
    public void onFinish() {
    // Send Message, Out of Time
    ((TextView)findViewById(R.id.timer_label)).setText("MESSAGE!");
        num++;
        done();  //My Own Method
        this.cancel();
    }
}.start();

完全に機能する別のカウンターがあり、このカウンターに影響を与えないようにコメントアウトしました。これは、残り3秒になるまで正常に機能します。

4

2 に答える 2

1

onFinish()残り 3 秒の時点でのメソッドの呼び出しに関する問題については、こちらの回答をお読みください。実際には、Android ですべての回答を読む必要があります: CountDownTimer は最後の onTick() をスキップします!質問。その理由を理解するのに役立ちます。そのスレッドについて話すと、通常、人々は終了が約と呼ばれる問題を抱えています。推定時刻の 1 秒前。それらについては、(参照された回答から)すべてのティックの開始時に、 onTick() が呼び出される前に、カウントダウンが終了するまでの残り時間が計算されることが理解できます。この時間がカウントダウン時間間隔よりも小さい場合、onTick はもう呼び出されません。しかし、そこの答えには、CountDownTimer を実行しているスレッドを遅延させるバックグラウンドに他のプロセスが存在する可能性があり、さらに Android 自体が CountDownTimer のメッセージ ハンドラーを呼び出すときに小さな遅延が発生する可能性があるため、望ましくない遅延が原因である可能性があることも示されています。

回答で提案されている回避策はほとんどありません。1 つは、間隔時間を減らすか、countDownTimer の最大値を増やすことです。方法の 1 つの代替手段もありcountDownTimerます。これが考えられる理由を理解するのに役立ち、回避策を実行するのに役立つことを願っています.

于 2013-06-01T00:59:02.237 に答える
0

あなたはこのようにすることができます

    private int secondsLeft = 0;
    private int minutes;
    private int seconds;
    private String timeString;

counter = new CountDownTimer(30000, 100) {
            public void onTick(long ms) {
                if (Math.round((float) ms / 1000.0f) != secondsLeft) {
                    secondsLeft = Math.round((float) ms / 1000.0f);
                    minutes = (secondsLeft % 3600) / 60;
                    seconds = secondsLeft % 60;
                    timeString = String.format("%02d:%02d", minutes, seconds);
                    textViewTimer.setText(timeString);
                }
            }
            public void onFinish() {
                textViewTimer.setText("00:00");
            }
        }.start();
于 2018-05-10T05:46:41.300 に答える