Какой лучший способ выполнить задачу несколько раз в 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, который хорош в протоколе обмена сообщениями
Для того, чтобы быть постоянно онлайн, вам нужен Android Service
работает над потоком. Вы можете использовать любой из вышеперечисленных методов, которые вы указали в службе.
НО, когда вы создаете приложение для чата, вам придется постоянно подключаться к серверу каждые 2-3 секунды, что, я думаю, не очень хорошо для пользователя (с точки зрения интернет-данных, которые будет использовать ваше приложение).
Лучший рекомендуемый протокол для использования в приложении чата XMPP
( Джаббер). Он определяет все правила, которые должно иметь обычное приложение чата, и его очень легко реализовать. Это сервер типа push-уведомлений, который автоматически отправляет уведомление клиенту, когда приходит новое сообщение или добавляется новый друг (даже Gtalk использует этот протокол).
Существует хороший сервер с открытым исходным кодом, который обеспечивает XMPP
интеграция под названием Openfire, которую я бы порекомендовал.
Эта же компания также предоставляет библиотеку для интеграции на стороне клиента под названием Smack, которую вы можете легко внедрить в свое приложение, чтобы использовать простую функциональность чата.