2013-11-04 33 views
7

In Android ci sono alcune opzioni per la gestione di aggiornamento come Timer, TimerTask, ScheduledExecutorService, AlarmManager & Handler. Qual è il metodo migliore per farlo.Qual è il metodo migliore per eseguire ripetutamente un'attività in Android? (Ad esempio: - Punteggi di aggiornamento, Ui di aggiornamento)

Qualcuno ha verificato l'utilizzo delle risorse dei metodi sopra citati ?. Sto elencando qui l'implementazione dei metodi sopra citati.

Uso Handler per eseguire un compito ripetutamente

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 

    public void run() { 
     new MyScheduledTask.execute(param); 
    } 

}, TimeInterval); 

Uso Timer per eseguire un compito ripetutamente

timer = new Timer(); 

timer.scheduleAtFixedRate(new TimerTask() { 

    synchronized public void run() { 
     new MyScheduledTask.execute(param); 
     } 

}}, 10000, 10000); 

Uso ScheduledExecutorService per excuting un'attività ripetutamente

ScheduledExecutorService scheduler = 
Executors.newSingleThreadScheduledExecutor(); 
scheduler.scheduleAtFixedRate 
    (new Runnable() { 
    public void run() { 
     new MyScheduledTask.execute(param); 
    } 
    }, 0, 10, TimeInterval); 

Utilizzando Timer con TimerTask per l'esecuzione di un compito più volte

Timer timer = new Timer(); 
timer.schedule(new UpdateTimeTask(),1, TimeInterval); 
class UpdateTimeTask extends TimerTask { 

    public void run() 
     {   
     new MyScheduledTask.execute(param); 
     } 
} 

AlarmManager per l'esecuzione programmata compito

public void setupTask(){ 

    // check task is scheduled or not 
    boolean alarmUp = (PendingIntent.getBroadcast(this, 0, 
      new Intent("YourPackageHere.AlarmReceiver"), 
      PendingIntent.FLAG_NO_CREATE) != null); 

    if ( !alarmUp) { 
     Intent intent = new Intent("YourPackageHere.AlarmReceiver"); 
     intent.putExtra("activate", true); 
     PendingIntent pendingIntent = 
        PendingIntent.getBroadcast(this, 0, 
        intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.set(Calendar.HOUR_OF_DAY, 0); 
     calendar.set(Calendar.MINUTE, 1); 
     calendar.set(Calendar.SECOND, 0); 

     AlarmManager alarmManager = 
        (AlarmManager) 
        this.getSystemService(this.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
        calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, 
        pendingIntent); 

     calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.set(Calendar.HOUR_OF_DAY, 7); 
     calendar.set(Calendar.MINUTE, 0); 

     alarmManager = (AlarmManager) 
        this.getSystemService(this.ALARM_SERVICE); 
     PendingIntent pendingIntent2 = 
        PendingIntent.getBroadcast(this, 1, 
       intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
        calendar.getTimeInMillis(), 
        AlarmManager.INTERVAL_DAY, pendingIntent2);   

    } 

} 

classe AlarmManager

public class AlarmReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 

    if (intent.hasExtra("activate")) { 

     new MyScheduledTask.execute(param); 
    } 

} 
} 

manifesto

<receiver android:name="YourPackageHere.AlarmReceiver"></receiver> 
+1

Invece di controllare periodicamente, si consiglia di utilizzare servizi come [MQTT] (http://mqtt.org/) fare le cose solo quando è disponibile un nuovo messaggio. Facebook usa anche 'MQTT'. Questo, ovviamente, richiede configurazioni lato server. –

+0

Puoi provare a utilizzare le notifiche push invece del polling. Ciò consente all'utente di risparmiare molto traffico di rete e batteria (il che è molto importante in quanto impedirai al telefono di dormire sempre e che manterrà anche il modem cellulare o l'antenna WiFi accesa e la batteria brucia continuamente). Se ricordo bene, il servizio GCM supporta XMPP, che è un ottimo protocollo da utilizzare per le applicazioni di chat. –

risposta

1

per essere sempre in linea avrete bisogno di un androide Service che corre sopra un filo. Puoi utilizzare uno dei metodi sopra indicati che hai indicato con un servizio.

ma come si stanno facendo un'applicazione di chat dovrete colpire il server continuamente per ogni 2-3 secondi, che credo non è un bene per l'utente (in termini di dati Internet che la vostra applicazione userà).

Il protocollo consigliato da utilizzare per un'applicazione di chat è XMPP (Jabber). Definisce tutte le regole che una normale applicazione di chat dovrebbe avere ed è molto facile da implementare. Si tratta di un tipo di server notifica push che spingerà automaticamente una notifica al cliente ogni volta che un nuovo messaggio è arrivato o è aggiunto un nuovo amico. (Anche Gtalk utilizza questo protocollo)

C'è un buon server open source che fornisce l'integrazione denominata Openfire, che consiglio.

La stessa azienda fornisce anche una libreria per l'integrazione lato client denominata Smack che è possibile implementare facilmente nell'applicazione per utilizzare la semplice funzionalità di chat.

1

Il gestore è il metodo migliore per eseguire è possibile eseguirlo in modo ricorsivo, sarà buono pensa così ...

Se ci si aspetta di più si dovrebbe seguire il metodo MQTT questo è è buono nel protocollo di messaggistica

http://mqtt.org/wiki/doku.php/mqtt_on_the_android_platform