Какой лучший способ выполнить задачу несколько раз в Android? (Например:- Обновление партитур, обновление пользовательского интерфейса)

В Android есть несколько вариантов обработки обновлений, таких как Timer, TimerTask, ScheduledExecutorService, AlarmManager & Handler. Какой лучший способ сделать это.

Кто-нибудь проверял использование ресурсов вышеперечисленными методами? Я перечисляю реализацию вышеупомянутых методов здесь.

Использование Handler для повторного выполнения задачи

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

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

}, TimeInterval);

Использование таймера для повторного выполнения задачи

timer = new Timer();

timer.scheduleAtFixedRate(new TimerTask() {

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

}}, 10000, 10000);

Использование ScheduledExecutorService для повторного исключения задачи

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

Использование Timer с TimerTask для повторного выполнения задачи

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

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

AlarmManager для выполнения запланированного задания

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);         

    }

}

Класс AlarmManager

public class AlarmReceiver extends BroadcastReceiver { 

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

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

        new MyScheduledTask.execute(param);
    }

}
}

манифест

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

2 ответа

Обработчик - лучший метод для запуска, вы можете запустить его рекурсивно, это будет хорошо, думает так...

Если вы ожидаете большего, вы должны следовать методу MQTT, который хорош в протоколе обмена сообщениями

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

Для того, чтобы быть постоянно онлайн, вам нужен Android Service работает над потоком. Вы можете использовать любой из вышеперечисленных методов, которые вы указали в службе.

НО, когда вы создаете приложение для чата, вам придется постоянно подключаться к серверу каждые 2-3 секунды, что, я думаю, не очень хорошо для пользователя (с точки зрения интернет-данных, которые будет использовать ваше приложение).

Лучший рекомендуемый протокол для использования в приложении чата XMPP( Джаббер). Он определяет все правила, которые должно иметь обычное приложение чата, и его очень легко реализовать. Это сервер типа push-уведомлений, который автоматически отправляет уведомление клиенту, когда приходит новое сообщение или добавляется новый друг (даже Gtalk использует этот протокол).

Существует хороший сервер с открытым исходным кодом, который обеспечивает XMPP интеграция под названием Openfire, которую я бы порекомендовал.

Эта же компания также предоставляет библиотеку для интеграции на стороне клиента под названием Smack, которую вы можете легко внедрить в свое приложение, чтобы использовать простую функциональность чата.

Другие вопросы по тегам