2013-03-28 12 views
8

Ho un timer nella mia applicazione che lancia AsyncTask ogni 15 secondi.Rilanciare Android Timer dopo che sono stati cancellati

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 
} 

Questo è lanciato dal metodo onCreate().

Quando chiamo un'altra attività, è necessario annullare questo timer, che ho utilizzato utilizzando il metodo timer.cancel() nel mio metodo onPause() nella mia attività principale.

Ora, quando torno all'attività principale, devo riavviare il timer. Ho provato a riavviare lo AsynchTaskTimer() nel metodo onRestart(), ma ottengo uno java.lang.IllegalStateException: Timer was canceled.

Come riavviare il timer?

+0

imposta il timer come nullo in onpause e lo reiscrive come timer = new Timer(); e lanciarlo mentre il vecchio oggetto hash è stato cancellato non può essere riavviato se non viene reiniziato a uno nuovo –

+0

perché stai usando gestore e timer insieme? – tony9099

risposta

14

Provare a utilizzare:

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 
    } 

Usando questo si può ancora una volta allocare la memoria per timer e avviarlo per quanto ne so.

+0

grazie, funziona, combinato con l'annullamento del timer nel metodo 'onPause()'! – pteixeira

+0

è fantastico !!! –

+0

l'unica cosa che non potevo ancora ottenere è cosa fa il secondo parametro del metodo schedule()? timer.schedule (timertask, 0, 15000), in questo esempio cosa significa lo 0 – antroid

12

Allora, cosa dice docs circa annullare() Metodo:

Nota che chiamare questo metodo all'interno del metodo run di un'attività ricorrente timer garantisce assolutamente che il compito timer non correre di nuovo.

Significa che se si annulla() il timer, non è possibile eseguirlo di nuovo. È necessario creare una nuova istanza di Timer, ad esempio nel metodo onResume() se si desidera eseguirla di nuovo.

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

Invece di usare TimerTask, è possibile spostare il codice (che viene utilizzato per aggiornare il GPS) per un service. Penso sia meglio. È possibile chiamare startService() in onCreate() e stopService() in onDestroy(). Tieni presente che i servizi vengono eseguiti sul thread principale dell'interfaccia utente, pertanto assicurati di evitare NetworkOnMainThreadException nell'attività di aggiornamento GPS.

+0

questo era il mio approccio iniziale, ma per qualche motivo il mio servizio non è iniziato .. Poiché questo è solo per una dimostrazione di concetto che doesn conta davvero, ma è sulla mia lista TODO se mai si evolverà in una cosa reale! – pteixeira

Problemi correlati