簡體   English   中英

處理程序隨機停止更新setText

[英]Handler randomly stops updating 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);


    }

};

要回答您的問題,請將Handler回調移至Service。 即使您的用戶離開您的應用程序來編寫文本或電子郵件或撥打電話,這也將保持准確的時間。

但是,您嘗試連續運行Runnable,則只需要每秒運行一次(例如handler.postDelayed(this, 1000); ),但是硬編碼1000毫秒將在每次執行時引入一個小錯誤。 您可以編寫一種方法來檢查偏移量並相應地進行調整...但是ChronometerCountDownTimer類已經很方便地為您完成了此操作。 您應該只切換為使用其中之一或復制其回調方法。

(是的,CountDownTimer的計數方向錯誤,只是將數學取反。)

最后,查看DateUtils.formatElapsedTime() 它需要毫秒,並輸出特定於語言環境的“ HH:mm:ss”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM