2013-01-10 14 views
6

W onCreate uruchamiam zadanie, które powtarza się co minutę. Oto, jak to zrobić:timer.scheduleAtFixedRate nie zatrzymuje się, gdy wywołuję anulowanie

myTimer = new Timer(); 
    int delay = 30000; // delay for 30 sec. 
    int period = 600000; // repeat every 60 sec. 
    doThis = new TimerTask() { 
     public void run() { 

        Log.v("TImer","repeated"); 
        wv.reload(); 

     } 
    }; 

    myTimer.scheduleAtFixedRate(doThis, delay, period); 

Cały kod znajduje się na Utwórz. Tak więc, gdy aplikacja wyłącza się z ekranu, widzę w logcat, że timer działa na czas i nie przestanie, chyba że aplikacja zostanie zniszczona. Tak więc w aktywności nazywam się myTimer.cancel();, ale to nie pomogło. Wciąż widzę aktualizacje w kodzie logującym, nawet gdy aplikacja nie jest wyświetlana na ekranie. A więc, jak zatrzymać timerTask?

Odpowiedz

4

Oto Twój kod wprowadzony do mojego pliku, z wartościami opóźnienia i okresu poprawionego, więc nie muszę czekać tak długo. Uruchomę aplikację. Widzę komunikaty w LogCat. Naciskam przycisk home na moim Galaxy S3. Następnie wiadomości zatrzymują się w LogCat.

public class MainActivity extends Activity { 
Timer myTimer; 
TimerTask doThis; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    myTimer = new Timer(); 
    int delay = 0; // delay for 30 sec. 
    int period = 1000; // repeat every 60 sec. 
    doThis = new TimerTask() { 
     public void run() { 

        Log.v("TImer","repeated"); 

     } 
    }; 

    myTimer.scheduleAtFixedRate(doThis, delay, period); 
} 

@Override 
protected void onPause() { 
    myTimer.cancel(); 
    super.onPause(); 
} 

} 
+0

Umieściłem go na onStop i działa teraz, dziwne, dlaczego to nie działa naPause ... – Daler

+0

Dziwne. Czy Log.v pokazuje cokolwiek w twojej metodzie onPause? Jeśli nie, to myślę, że może być błędnie napisane, a może twój P nie jest wielkimi literami lub czymś innym nie na miejscu - więc tak naprawdę nie jest wywoływany. –

+0

)) dokładnie, moja właściwość onPause została uznana za błędną ...) – Daler

0

Możliwe, że ponieważ wątek został już wysłany, działa po raz ostatni. W onLoad ustaw zmienną na true, następnie w onPause ustaw na false. Następnie w zadaniu timera uruchom swój kod, jeśli zmienna jest prawdziwa.

Zapisuj w dzienniku poza nową instrukcją if. Jeśli rzeczywiście działa po raz ostatni, to może być rozwiązaniem. Ale jeśli nadal działa wiele razy po onPause, nie bierz mojego rozwiązania.

+0

Próbowałem w ten sposób również, to nie działa. I powtarza się w kółko, więc ... – Daler

+0

Twój kod działa dla mnie, z wyjątkiem tego, że wziąłem wv.reload(); - Nie jestem pewien, co robisz w tej metodzie. Czy to jest coś, co spowodowałoby ponowne uruchomienie aplikacji? –

+0

Co więcej, czy możesz umieścić Log.v na swojej metodzie onPause, aby upewnić się, że jest rzeczywiście uruchamiany? –

Powiązane problemy