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>
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. –
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. –