2013-04-04 10 views
7

Ho un codice che imposta un timer, ma se un utente imposta il timer mentre è in uso ho bisogno di rimuovere il runnable che esegue il timer e ricominciare. Ma quando non esiste un callback di callback eseguibile e questo codice viene chiamato si blocca la mia applicazione. Quindi ho bisogno di verificare se un gestore è in esecuzione, in tal caso quindi terminarlo e riavviarlo, ma osservando la documentazione e altre domande StackOverflow, non riesco a vedere se è possibile.Controlla se il gestore di Android ha richiamate

Ecco il mio codice, ho commentato tutto il codice che deve essere eseguito solo se esiste un gestore eseguibile:

submitTimer.setOnClickListener(new View.OnClickListener(){ 

     public void onClick(View v) { 
      String s = timer.getText().toString(); 
      if(!s.equals("")) 
      { 
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE 
      Map.handler.removeCallbacks(Map.getRunnable()); 
      Map.runnable.run(); 
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE 
      int l = Integer.parseInt(s); 
      Map.timerinmins = l; 
      timer.setHint("Current Timer is "+Map.timerinmins); 
      timer.setText(""); 
      Toast.makeText(Preferences.this, "Timer is set!", Toast.LENGTH_SHORT).show(); 
      } 

      else 
      { 

       Toast.makeText(Preferences.this, "No value was entered", Toast.LENGTH_SHORT).show(); 
      } 
    } 

}); 

Qualcuno può aiutarmi a trovare un modo di controllare i gestori dello stato attuale?

risposta

4

Se si desidera, è possibile inviare un messaggio vuoto quando si attiva per la prima volta una richiamata e quindi controllare tale messaggio nel gestore. Questo messaggio vuoto potrebbe rappresentare l'esistenza di un callback. La rimozione successiva di quel messaggio potrebbe quindi essere utilizzata in modo simile per verificare se il callback è ancora presente. Non avere una situazione rilevante come questa da cui partire, ma ho pensato che avrei almeno provato a condividere una possibilità.

... 
Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER); 
... 
if(Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER) 
... 
Map.handler.removeMessage(CALLBACK_PRESENT_INTEGER); 
... 

Questo è probabilmente non è l'ideale, ma potrebbe essere una possibile soluzione se si ha accesso al gestore dal punto in cui viene utilizzato il callback. Non sono sicuro se c'è un modo diretto per scoprirlo.

3

riferimento alla risposta Jay Snayder s':

Dal momento che ci sono casi in cui Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER) restituisce false anche se Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER) è stato chiamato (è successo anche a me), può essere più sicuro utilizzare un valore booleano per determinare se il il gestore ha callback o no.
Quindi, la logica codice è qualcosa di molto semplice come questo:

... 

boolean callbackPresent = false; 

... 

if(!callbackPresent) { 

    // do what you have to do in case the handler doesn't have callbacks 

    // right before adding a callback to the handler, call: 
    callbackPresent = true; 

} else { 

    // do what you have to do in case the handler has callbacks 

    // right before removing the callbacks from the handler, call: 
    callbackPresent = false; 
} 

... 

sto usando questa soluzione in un app e che sta funzionando perfettamente.

Problemi correlati