2013-03-28 19 views
8

Mam timer w mojej aplikacji, która uruchamia AsyncTask co 15 sekund.Ponowne uruchamianie zegarów z systemem Android po ich anulowaniu

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 
} 

Uruchomiono to za pomocą metody onCreate().

Kiedy zadzwonię do innej czynności, muszę anulować ten zegar, co zrobiłem przy użyciu metody timer.cancel() na mojej metodzie onPause() w mojej głównej aktywności.

Teraz po powrocie do głównej aktywności muszę ponownie uruchomić timer. Próbowałem ponownie uruchomić AsynchTaskTimer() w metodzie onRestart(), ale otrzymałem java.lang.IllegalStateException: Timer was canceled.

Jak uruchomić ponownie zegar?

+0

ustaw timer jako wartość null w trybie onpause i powtórz to tak, jak timer = new Timer(); i uruchomić go, ponieważ stary zakodowany obiekt został anulowany, nie można go ponownie uruchomić, chyba że zostanie ponownie zainicjowany na nowy –

+0

, dlaczego używasz programu obsługi i timer razem? – tony9099

Odpowiedz

14

Spróbuj użyć:

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 
    } 

Za pomocą tego można ponownie przydzielić pamięć Timer i uruchomić go AFAIK.

+0

dziękuję, działa to w połączeniu z anulowaniem timera w metodzie 'onPause()'! – pteixeira

+0

to świetnie !!! –

+0

Jedyne czego nie mogłem uzyskać to co robi drugi parametr metody schedule()? timer.schedule (timertask, 0, 15000), w tym przykładzie co oznacza 0 oznacza – antroid

12

Więc co mówi docs o cancel() metoda:

Zauważ, że wywołanie tej metody od wewnątrz metody run z powtarzając zadania czasomierza absolutnie gwarantuje, że zadanie timer nie uruchomić ponownie.

Oznacza to, że jeśli raz anulujesz() Timer, nie możesz go uruchomić ponownie. Musisz utworzyć nową instancję Timera, na przykład w metodzie onResume(), jeśli chcesz uruchomić ją ponownie.

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

Zamiast TimerTask, można przenieść swój kod (który służy do aktualizacji GPS) do service. Myślę że to jest lepsze. Możesz zadzwonić pod numer startService() w onCreate() i stopService() w onDestroy(). Zwróć uwagę, że usługi działają w głównym wątku UI, więc upewnij się, że unikniesz NetworkOnMainThreadException w swoim zadaniu aktualizacji GPS.

+0

to było moje początkowe podejście, ale z jakiegoś powodu moja usługa się nie rozpoczęła. Ponieważ jest to tylko dowód koncepcji, To naprawdę ważne, ale jest na mojej liście TODO, jeśli kiedykolwiek przekształci się w coś prawdziwego! – pteixeira