2013-03-28 14 views
8

Ich habe einen Timer in meiner Anwendung, die alle 15 Sekunden eine AsyncTask startet. DieseAndroid-Relaunch-Timer nach dem Abbrechen

Timer timer = new Timer(); 

public void AsynchTaskTimer() { 
    final Handler handler = new Handler(); 

    TimerTask timertask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         new updateGPSTask().execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(timertask, 0, 15000); // execute in every 15sec 
} 

gestartet von der onCreate() Methode.

Wenn ich eine andere Aktivität anrufe, muss ich diesen Timer abbrechen, was ich mit timer.cancel() auf meiner onPause() Methode in meiner Hauptaktivität gemacht habe.

Jetzt, wenn ich zur Hauptaktivität zurückkehre, muss ich den Timer neu starten. Ich habe versucht, die AsynchTaskTimer() in der onRestart() Methode neu zu starten, aber ich bekomme eine java.lang.IllegalStateException: Timer was canceled.

Wie starte ich meinen Timer neu?

+0

Setzen Sie den Timer in onpause auf null und wiederholen Sie ihn wie timer = new Timer(); und starten Sie es, wenn das alte Hash-Objekt abgebrochen wurde. Es kann nicht neu gestartet werden, es sei denn, es wurde erneut initialisiert. –

+0

Warum verwenden Sie Handler und Timer zusammen? – tony9099

Antwort

14

Versuchen Sie es mit:

public void AsynchTaskTimer() { 
    final Handler handler = new Handler(); 

    TimerTask timertask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         new updateGPSTask().execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer = new Timer(); //This is new 
    timer.schedule(timertask, 0, 15000); // execute in every 15sec 
    } 

Damit verwenden Sie wieder auf den Speicher Timer und zuordnen kann AFAIK starten.

+0

danke, das funktioniert, kombiniert mit dem Abbrechen des Timers in der 'onPause()' Methode! – pteixeira

+0

das ist großartig !!! –

+0

einzige Sache, die ich noch nicht bekommen konnte, ist was der zweite Parameter der Methode schedule() tut? timer.schedule (zeiterfassung, 0, 15000), in diesem Beispiel, was die 0 bedeutet – antroid

12

Also, was sagt docs über cancel() Methode:

Beachten Sie, dass diese Methode aufrufen aus der run-Methode eines Wiederholung Timer Aufgabe absolut gewährleistet, dass die Timer-Task wird nicht erneut ausgeführt.

Es bedeutet, dass wenn Sie einmal() Timer abbrechen, Sie es nicht erneut ausführen können. Sie müssen eine neue Instanz von Timer erstellen, zum Beispiel in onResume() Methode, wenn Sie es erneut ausführen möchten.

@Override 
public void onResume() { 
    super.onResume(); 
    // intialise new instance of Timer 
} 
1

Statt TimerTask zu verwenden, können Sie Ihren Code bewegen (die verwendet wird, GPS zu aktualisieren) zu einem service. Ich denke es ist besser. Sie können startService() in onCreate() und stopService() in onDestroy() anrufen. Beachten Sie, dass Dienste auf dem Haupt-UI-Thread ausgeführt werden. Achten Sie daher darauf, in Ihrem GPS-Updater-Task zu vermeiden.

+0

das war meine erste Annäherung, aber aus irgendeinem Grund begann mein Dienst nicht .. Da dies nur für einen Proof of Concept ist es nicht Es ist wirklich egal, aber es ist auf meiner TODO-Liste, wenn es sich jemals zu einer echten Sache entwickelt! – pteixeira

Verwandte Themen