2016-07-14 11 views
0

Ich habe einen geplanten Timer ausgeführt, um die Verzögerung bei der Ankunft in der Schule anzuzeigen. Immer wenn ein Schüler in die Schule kommt, öffnet sich ein benutzerdefinierter Dialog mit der Anzeige delay in arrival : 20.0 min. Es wird jede halbe Minute um 0.5min erhöht. Mein Code ist -So stoppen Sie den geplanten Timer, nachdem der Dialog geschlossen wurde

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(); 
     } 
    }; 

Die Probleme sind -

a) der Timer läuft im Hintergrund für die alten angekommen Schüler, auch wenn der Dialog für neue angekommen Schüler geöffnet. Ich meine, der Timer wird nie beendet, wenn der Dialog geschlossen wird. (Der Dialog wird nur geschlossen, um die Ankunft des Schülers zu bestätigen.)

b) Manchmal zeigt die Textansicht delay_time einen falschen Wert an. Es zeigt 22.0min und sofort 0.5min und dann wieder 23.0min.

Warum ist das?

EDIT 1: timer cancel nach Klicken Sie im Dialog

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

EDIT 2: Die Protokolle zeigen immer korrekte Werte aber in der Benutzeroberfläche manchmal gibt es ein Problem. Das Problem ist, dass zum Beispiel -

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 

Dies geschieht manchmal ...

Antwort

1

Es scheint, dass Sie nie den ersten Zeitgeber sind zu entfernen. Wenn Sie also den zweiten Timer initialisieren, müssen Sie zwei Timer gleichzeitig versuchen, die Benutzeroberfläche zu aktualisieren.

Speichern Sie den Timer als Elementvariable und überprüfen Sie, ob er initialisiert ist, bevor Sie einen zweiten starten. Wenn der Dialog geschlossen ist, sollten Sie cancel() die Timer. So sollten Sie auch sehen, wie Sie Methoden implementieren when the dialog is dismissed - dies sollte eine Bereinigungsmethode aufrufen, die cancel() und setzt den Timer auf Null.

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

Ok Ich habe nur 1 Timer und es ist Timer geplant, die ich in der Funktion startUpCounting() wie oben gezeigt setzen. Derzeit, was ich getan habe, war, wenn entlassen() aufgerufen wurde, die nächste Zeile, die ich timer.cancel() gebe aber immer noch nicht funktioniert – Mark023

+0

Wird die Methode aufgerufen? Können Sie mehr Code hinzufügen? Setzen Sie es ebenfalls auf null. – bradkratky

+0

Diese Methode wird nur einmal in onFinish() des Countdown-Timers aufgerufen und ich setze den Timer ebenfalls auf null. Immer noch nicht funktioniert..Siehe meine aktualisierte Frage – Mark023