2014-10-04 14 views
6

Sto provando a creare un'app per Android che eseguirà ripetutamente alcuni processi ogni 10 minuti. Come ho scoperto, Handlers sono più affidabili dei timer o della programmazione. Quindi svilupperò la mia app utilizzando lo Handlers utilizzando i seguenti codici.Gestore Android per attività ripetute - si sovrapporrà? Timer-task VS gestore VS gestore allarmi

Sono po 'preoccupato del fatto che i codici sottostanti creeranno separata Handlers ad ogni volta che avvio l'applicazione e tenerli in esecuzione in parallelo, può essere dato che sto creando il Handler su onCreate.

Allora, qual è il modo migliore per mantenere solo un singolo Handler viene eseguito in background in un momento?

private Handler handler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    handler = new Handler(); // new handler 
    handler.postDelayed(runnable, 1000*60*10); // 10 mins int. 
    setContentView(R.layout.activity_pro__sms); 
} 

private Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     /* my set of codes for repeated work */ 
     foobar(); 
     handler.postDelayed(this, 1000*60*10); // reschedule the handler 
    } 
}; 
+0

Basta chiedersi: qual è il contesto del tuo "lavoro ripetuto"? O forse meglio detto: che tipo di app è? Può essere un'ipotesi molto generosa pensare che gli utenti utilizzeranno attivamente la tua app per 10+ minuti alla volta (a meno che non sia come un gioco o così, da qui la mia domanda). Usando un 'Handler' mentre la tua app * non * è in primo piano, non potrebbe la giusta linea di condotta. –

+0

Perché non utilizzare un servizio? –

+0

Non ho bisogno di perdere l'attività eseguendo anche in modalità sospensione. I servizi possono essere attivi anche in modalità inattiva (sleep)? O devo avere una sveglia. Per quanto riguarda l'utilizzo delle risorse da parte dei servizi rispetto ad AlarmManager (ora sto provando le cose con Alarm Manager) –

risposta

4

ho deciso di rispondere alla mia domanda dal momento che ho trovato il modo di farlo modo giusto. Il modo Android. Prima di tutto quello che stavo cercando di fare e pubblicato nella domanda è un approccio sbagliato al mio requisito. Ora sto postando questo così qualcun altro non lo farà in modo sbagliato, ma nel modo seguente.

Android ha poche opzioni per i tempi.

  1. Timer-task -> viene eseguito mentre l'applicazione è attiva. meglio per i tempi a breve termine. L'utilizzo delle risorse è più alto.

  2. Handler -> corre mentre l'applicazione è vivo. Ma non adatto ad essere usato come schedulatore. (questo è quello che ho chiesto e non è il modo corretto per farlo). Handlers sono il modo migliore per fare qualcosa ripetutamente fino a quando l'app non viene uccisa.

  3. allarme-manager -> Il modo migliore per programmare qualcosa accada in futuro, anche se l'applicazione viene ucciso. (questo è quello che dovrei applicare per la mia app).

Questo è quello che ho capito. Correggimi se sbaglio.

+4

Questo non è corretto. Un gestore pianifica semplicemente le attività sul thread dell'applicazione. L'attività del gestore muore quando l'applicazione viene uccisa. –

+0

Quindi, cosa succede quando si chiama il metodo "postDelayed (Runnable, long)". Mantiene vivo il thread dell'app in modo che possa attivare il runnable. –

+2

No! L'evento ritardato semplicemente non si verificherà mai. –

3

È possibile estendere la classe di applicazione e svolgere il proprio lavoro.

public class App extends Application { 

    private Handler handler; 

    @Override 
    protected void onCreate() { 
     super.onCreate(); 
     handler = new Handler(); // new handler 
     handler.postDelayed(runnable, 1000*60*10); // 10 mins int. 
     setContentView(R.layout.activity_pro__sms); 
    } 

    private Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      /* my set of codes for repeated work */ 
      foobar(); 
      handler.postDelayed(this, 1000*60*10); // reschedule the handler 
     } 
    }; 
} 

E dichiarare la classe in palese:

<application android:name=".App"> 

cura

ma funzionerà solo se la vostra applicazione è in esecuzione, altrimenti è possibile utilizzare AlarmManager.

+0

Grazie. Farò un tentativo e risponderò entro pochi minuti. –

+0

in realtà quello che voglio è impedire la creazione di più gestori. dovrebbe esserci un modo, nel sito degli sviluppatori Android si dice che il gestore è il modo più adatto. –

+2

Ciò che Vang ti ha dato creerà un solo gestore e ripeterà il processo in base al tempo trascorso. Si noti che sta estendendo la classe Application, chiamata solo una volta, cioè quando viene creata l'applicazione (all'avvio dell'applicazione). Il gestore smetterà di funzionare se si distrugge completamente l'applicazione, altrimenti ne verrà eseguito solo uno alla volta. Se stai cercando un gestore che funzioni costantemente, usa AlarmManager come menzionato sopra. – NightwareSystems