处理程序随机停止更新 setText



我做了一个可运行的秒表,它大部分时间都可以正常工作并正确更新时间。但有时当我切换到另一个片段然后切换回来时,它会随机运行几秒钟(2-15 之间的任何地方(,然后停止。处理程序仍在运行,但文本未更新。当我再次切换片段时,它会跳到正确的时间,然后恢复滴答作响。这很奇怪,因为它不会每次我切换片段时都这样做,但它经常发生。

//code in fragment 1 class
 start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (!MainActivity.timeOn && spinner.getSelectedItem()!=null){
                MainActivity.timeOn=true;
                if(MainActivity.timeOn) {
                    MainActivity.paused = false;
                    MainActivity.stopTime=false;
                    MainActivity.StartTime = SystemClock.uptimeMillis();
                    MainActivity.handler.postDelayed(MainActivity.runnable, 0);

                }
            }}
    });
//code in main Activity class
  public static Runnable runnable = new Runnable() {
    public void run() {
        MillisecondTime = SystemClock.uptimeMillis() - StartTime;
        UpdateTime = TimeBuff + MillisecondTime;
        Seconds = (int) (UpdateTime / 1000);
        Minutes =1 +( Seconds / 60);
        Hours = Minutes / 60;
        Seconds = Seconds % 60;
        MilliSeconds = (int) (UpdateTime % 1000);
        minuteSum = (Hours * 60) + Minutes;
        minuteSumDaily = (Hours * 60) + Minutes;

        textView.setText("" + Hours + ":"
                + String.format("%02d", Minutes) + ":"
                + String.format("%02d", Seconds));

        handler.postDelayed(this, 0);

    }
};

要回答您的问题,请将处理程序回调移动到服务。这将保持准确的时间,即使你的用户离开你的应用来写短信或电子邮件或拨打电话。

但是,您

尝试连续运行 Runnable,您只需要每秒运行一次(例如handler.postDelayed(this, 1000);(,但硬编码1000毫秒会在每次执行时引入一个小错误。您可以编写一种方法来检查偏移量是多少并相应地进行调整......但是天文台表和倒数计时器课程已经方便地为您执行此操作。 您应该切换到使用其中之一或复制其回调方法。

(是的,CountDownTimer的计数方向错误,但只是颠倒了数学。

最后,查看DateUtils.formatElapsedTime((。它需要毫秒并输出特定于区域设置的"HH:mm:ss"。

最新更新