2016-07-14 28 views
0

我有計劃的計時器正在運行以顯示上學延遲。每當學生抵達學校時,會打開一個自定義對話框,顯示delay in arrival : 20.0 min。每半分鐘它會增加0.5min。我的代碼 -如何在對話框關閉後停止計劃的計時器

public void startTimer(long delay_minutes) { 
    final long delay = delay_minutes; 
    delay_countup = (double) delay; 

    //Start the scheduled time 
    departuretimer = new Timer(); 
    departuretimer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      countup = 0.0 + delay_countup; 
      Log.d("hi","Values 0" + delay_countup + countup); 
      mHandler.obtainMessage(1).sendToTarget(); 
      delay_countup = delay_countup + 0.5; 
      Log.d("hi","Values 1" + delay_countup); 
     } 
    }, 0, 30000); 
} 

public Handler mHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      delay_time.setText(String.valueOf(countup) + "min"); 
      rootView.invalidate(); 
     } 
    }; 

的問題是 -

一)計時器背景即使在打開的對話框新抵達的學生老學生抵達運行。我的意思是,當對話框關閉時,定時器永遠不會被終止(對話框關閉只是爲了確認學生的到來)

b)有時textview delay_time顯示錯誤的值。它顯示22.0min並立即顯示0.5min,然後再顯示23.0min

這是爲什麼?

編輯1: 處理timer cancel點擊按鈕後,在彈出的對話框

private void handleClickAction() { 
     dismiss(); 
     timer.cancel(); 
     timer = null; 
} 

編輯2: 日誌總是顯示正確的價值觀,但在UI中有時出現了問題。問題是,例如 -

delay_countup = 50.0 
countup = 50.0 
Textview updates as 50.0 //This is correct 

Now, 
delay_countup = 50.5 
countup = 50.5 
Textview updates as 0.5 //This is incorrect. I need 50.5 

這有時會發生......

回答

1

看來你永遠不會除去第一計時器。所以當你初始化第二個定時器時,你有兩個定時器同時嘗試更新UI。

將定時器存儲爲成員變量,並檢查在啓動第二個定時器之前它是否已初始化。當對話框關閉時,您應該cancel()Timer。所以你也應該看看如何實現方法when the dialog is dismissed - 這應該調用清理方法cancel()並將計時器設置爲空。

public class DialogTest extends Dialog { 

    Timer timer; 
    double countup = 0; 
    double initial_time = 0; 

    public DialogTest(Context context){ 
     super(context); 

    } 


    @Override 
    protected void onStart() { 
     super.onStart(); 

     startUpCounting(); 
    } 

    @Override 
    protected void onStop() { 
     Log.e("b", "timer stopped"); 
     if(timer != null){ 
      timer.cancel(); 
      timer = null; 
     } 

     super.onStop(); 
    } 

    public void startUpCounting() { 
     delay_for_student.setText("Delay in Arrival"); 
     rootView.invalidate(); 
     Log.e("b", "timer started"); 
     if(timer != null){ 
      timer.cancel(); 
      timer = null; 
     } 
     timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 
       countup = 0.0 + initial_time; 
       if (countup == 0.0) { 
        onTimeHandler.obtainMessage(1).sendToTarget(); 
       } else { 
        mHandler.obtainMessage(1).sendToTarget(); 
       } 
       initial_time = initial_time + 0.5; 
      } 
     }, 0, 1000); 
    } 



    public Handler mHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      Log.e("b", "timer: " + countup); 
      delay_time.setText(String.valueOf(countup) + "min"); 
      rootView.invalidate(); 
     } 
    }; 

    public Handler onTimeHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      Log.e("b", "timer ---"); 
      delay_time.setText("-"); 
      rootView.invalidate(); 
     } 
    }; 
} 
+0

確定我只有1個定時器,定的定時器,我把在函數startUpCounting(),如上所示。目前我做的是,當調用dismiss()時,我給出的下一行timer.cancel()仍然不起作用 – Mark023

+0

被調用的方法是什麼?你能包含更多的代碼嗎?將它也設置爲null。 – bradkratky

+0

此方法在倒計時器的onFinish()中僅被調用一次,並且我也將計時器設置爲null。仍然無法正常工作..查看我更新的問題 – Mark023