Мне нужно разработать простое приложение, которое каждые 5 секунд извлекает json с сервера. Я знаю, что это разрядит аккумулятор, но поскольку у меня нет контроля на сервере, это единственное решение, которое у меня есть на данный момент, поэтому оставайтесь со мной. (Это демо-приложение, окончательный релиз будет полностью отличаться)Правильный способ сделать опрос в приложении для Android
Что я сделал:
Я создал IntentService и в его onHandleIntent я запрос HTTP и управлять ответ асинхронно. Читая документы, IntentService предпочитает Сервис. В конце, как видно из других тем, я использую класс AlarmManager для воссоздания намерения. Это метод:
private void repeat() {
lastTrigger = System.currentTimeMillis();
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent serviceIntent = new Intent(this, StatusPollingService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.RTC_WAKEUP, lastTrigger + UPDATE_INTERVAL, pendingIntent);
}
В моем OnCreate в моей первой деятельности, я просто запустить службу:
serviceIntent = new Intent(BaseActivity.this, StatusPollingService.class);
startService(serviceIntent);
Мои вопросы:
- Когда я закрываю мое приложение (с использованием назад), намерениеService продолжает выполнять запросы и воссоздает себя (как и ожидалось), поэтому я должен убить его вручную
- Я хотел бы остановиться, чтобы сделать ПОЛЛИНГ каждый раз, когда мое приложение идет в фоновом режиме и перезагрузки, когда идет на переднем плане, чтобы ограничить разрядку аккумулятора
Мои другие вопросы:
я реализовал класс, запускает прослушиватель, когда приложение идет в фоновом режиме/переднем плане. Я реализовал интерфейс в моей BaseActivity и в моем IntentService. Когда приложение идет в фоновом режиме, логическое значение становится ложным, и я не выполняю метод repeat(). Когда я иду на переднем плане, в моем методе onBecameForeground Я просто создать сервис:
serviceIntent = new Intent(BaseActivity.this, StatusPollingService.class);
@Override
public void onBecameForeground() {
startService(serviceIntent);
}
Идущий в фоновом режиме, нет никаких проблем, но идти на переднем плане нескольких intentService созданы, один intentService за каждую операцию у меня есть в том, момент (я вижу это в журнале).
Мои вопросы:
- Это лучший способ сделать эту работу? Как я могу решить эти проблемы?
- Если это лучший (или менее плохой) способ, как я могу создать один экземпляр IntentService?
Большое вам спасибо за вашу помощь
Да, я ищу решения с Handler и Timers, но где я должен его использовать? В моем классе приложений? –
Основной вид деятельности тоже (опять же, предполагая, что вам нужно работать только на переднем плане), если у вас нет нескольких активных действий, которые постоянно переключаются. Тогда что-то более постоянное - вроде да, класс Application - должно быть лучше. – SVD
В любом случае я знал, что одновременно должен быть один экземпляр, но вот что я делаю: я пытаюсь подключиться к недостижимому URL-адресу с тайм-аутом в 1 секунду. Когда я перехожу в свое приложение, возвращайтесь домой и возвращайтесь назад, у меня есть несколько журналов, говорящих «Подключение к http: // xx», а затем несколько журналов, говорящих «невозможно подключиться». Я получаю тот же результат с синхронизацией и асинхронными запросами, я не могу это объяснить –