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

В Android есть несколько вариантов обработки обновления, таких как Timer, TimerTask, ScheduledExecutorService, AlarmManager & 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>

person Sujith    schedule 04.11.2013    source источник
comment
Вместо периодической проверки вам следует использовать такие службы, как MQTT, чтобы действовать только тогда, когда доступно новое сообщение. Facebook тоже использует MQTT. Это, конечно, требует конфигурации на стороне сервера.   -  person Lawrence Choy    schedule 04.11.2013
comment
Вы можете попробовать использовать push-уведомления вместо опроса. Это экономит пользователю много потраченного впустую сетевого трафика и батареи (что наиболее важно, поскольку вы будете постоянно предотвращать переход телефона в спящий режим, а также будете постоянно поддерживать сотовый модем или антенну Wi-Fi и сжигать батарею). Если я правильно помню, служба GCM поддерживает XMPP, который является отличным протоколом для использования в чат-приложениях.   -  person lucian.pantelimon    schedule 04.11.2013


Ответы (2)


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

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

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

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

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

person bakriOnFire    schedule 04.11.2013

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

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

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

person Venkatesh S    schedule 04.11.2013