2013-03-15 11 views
14

Ich habe eine Animation in meiner Android App, die ein TextView andere Farben blinkt. Ich habe eine TimerTask-, Timer- und Runnable-Methode verwendet, um dies zu implementieren. Was ich tun muss, ist den Thread zu stoppen, wenn ein Benutzer die App während dieser Animation in onPause() verlässt und den Thread wieder aufnimmt, wenn der Benutzer in onResume() zur App zurückkehrt. Das Folgende ist der Code, den ich implementiert habe, aber er funktioniert nicht (die Teile onPause() und onResume()) und ich verstehe nicht warum. Ich habe ein paar andere Beiträge zu ähnlichen Themen gelesen, aber sie haben mir nicht geholfen, herauszufinden, was ich in meiner Situation tun soll. Ich habe gelesen, dass TimerTasks veraltet sind, und ich sollte wahrscheinlich eine ExecutorService-Methode verwenden; Es ist mir unklar, wie diese Funktion implementiert werden soll.Wie pausiere ich und setze einen TimerTask/Timer fort

...timerStep5 = new TimerTask() { 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
       if (b5) { 
        cashButton2SignalText.setBackgroundColor(Color.RED); 
        cashButton2SignalText.setTextColor(Color.WHITE); 
        b5=false; 
       } else { 
        cashButton2SignalText.setBackgroundColor(Color.WHITE); 
        cashButton2SignalText.setTextColor(Color.RED); 
        b5=true; 
       } 
       } 
      }); 
     } 
}; 

timer5.schedule(timerStep5,250,250); 

} 

public void onPause(){ 

    super.onPause(); 

    timerStep5.cancel(); 

} 

public void onResume(){ 

    super.onResume(); 

    timerStep5.run(); 

} 
+0

Mögliches Duplikat [Pausieren/Stoppen und Starten/Fortsetzen Java Timertask kontinuierlich?] (Http://stackoverflow.com/questions/2098642/pausing-stopping-and-starting-resuming-java-timertask-continuously) – Gboy

Antwort

12

Nach einem TimerTask abgebrochen wird, kann es nicht erneut ausführen, können Sie eine neue Instanz erstellen haben.

lesen Details hier:

https://stackoverflow.com/a/2098678/727768

ScheduledThreadPoolExecutor für neueren Code empfohlen werden, behandelt es die Fälle, wie Ausnahmen und Aufgabe längere Zeit als das geplanten Intervall nehmen.

Aber für Ihre Aufgabe sollte TimerTask genug sein.

+0

Ok, ich sah diesen Beitrag früher und war damit verwirrt; Vielleicht können Sie etwas für mich klären: Ein Benutzer könnte während der TimerTask-Aktivität meine App verlassen und zu dieser Aktivität mehr als einmal zurückkehren. Würde das nicht bedeuten, dass ich jedes Mal eine neue Instanz einer TimerTask in onResume() erstellen müsste, wenn der Benutzer diese Aktivität verlässt, und zurückgibt? – embersofadyingfire

+0

Frage: Wenn ich die Aktion eines Benutzers, der diese Aktivität für einen Moment verlässt und zurückkehrt, ignoriert und keine Implementierung für das Anhalten und Fortsetzen der TimerTask ausgelassen, sondern onStop() implementiert hat, um die TimerTask abzubrechen, wenn der Benutzer schließlich weitergeht eine andere Aktivität, würde dies zu einer Art Speicherverlust führen, während die TimerTask-Aktivität pausiert ist? – embersofadyingfire

+1

Ich glaube nicht, dass es zu einem Speicherleck kommen wird, aber es macht keinen Sinn, die UI-Aktualisierungsaufgabe im Hintergrund für nichts laufen zu lassen. Ja, Sie sollten TimerTask im laufenden Betrieb erstellen und es ist nicht wiederverwendbar. Es ist so gestaltet. (Ich denke für Thread-Sicherheit) Auch OnResume ist keine enge Schleife, die Kosten für die Erstellung eines Objekts ist vernachlässigbar. –

2

Hier ist, wie ich es gemacht habe. Fügen Sie pauseTimer boolean hinzu, wo auch immer die Pause stattfindet (Tasten-Listener vielleicht) und zählen Sie den Timer nicht, wenn er wahr ist.

private void timer(){ 
    Timer timer = new Timer(); 
    tv_timer = (TextView) findViewById(R.id.tv_locationTimer); 
    countTimer = 0; 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String s_time = String.format("%02d:%02d:%02d", 
          countTimer/3600, 
          (countTimer % 3600)/60, 
          countTimer % 60); 
        tv_timer.setText(s_time); 
        if (!pauseTimer) countTimer++; 
       } 
      }); 
     } 
    }, 1000, 1000); 
}