2016-10-13 13 views
0

Мне нужно разработать простое приложение, которое каждые 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); 

Мои вопросы:

  1. Когда я закрываю мое приложение (с использованием назад), намерениеService продолжает выполнять запросы и воссоздает себя (как и ожидалось), поэтому я должен убить его вручную
  2. Я хотел бы остановиться, чтобы сделать ПОЛЛИНГ каждый раз, когда мое приложение идет в фоновом режиме и перезагрузки, когда идет на переднем плане, чтобы ограничить разрядку аккумулятора

Мои другие вопросы:

я реализовал класс, запускает прослушиватель, когда приложение идет в фоновом режиме/переднем плане. Я реализовал интерфейс в моей BaseActivity и в моем IntentService. Когда приложение идет в фоновом режиме, логическое значение становится ложным, и я не выполняю метод repeat(). Когда я иду на переднем плане, в моем методе onBecameForeground Я просто создать сервис:

serviceIntent = new Intent(BaseActivity.this, StatusPollingService.class); 
@Override 
public void onBecameForeground() { 
    startService(serviceIntent); 
} 

Идущий в фоновом режиме, нет никаких проблем, но идти на переднем плане нескольких intentService созданы, один intentService за каждую операцию у меня есть в том, момент (я вижу это в журнале).

Мои вопросы:

  1. Это лучший способ сделать эту работу? Как я могу решить эти проблемы?
  2. Если это лучший (или менее плохой) способ, как я могу создать один экземпляр IntentService?

Большое вам спасибо за вашу помощь

ответ

0

Если вам это нужно только на переднем плане, то я бы не возиться с сигнализацией. Просто отправляйте намерения каждые 5 секунд на ваш намеренный сервис с помощью Handler.

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

Редактировать: чтобы развернуть бит, вам понадобятся будильники, когда (и если) вы будете опросить сервер в фоновом режиме, поэтому не пропустите этот код;) Обработчик будет «замерзать» в фоновом режиме поскольку ОС не подсчитывает время, пока устройство спало для отложенного выполнения обработчика.

+0

Да, я ищу решения с Handler и Timers, но где я должен его использовать? В моем классе приложений? –

+0

Основной вид деятельности тоже (опять же, предполагая, что вам нужно работать только на переднем плане), если у вас нет нескольких активных действий, которые постоянно переключаются. Тогда что-то более постоянное - вроде да, класс Application - должно быть лучше. – SVD

+0

В любом случае я знал, что одновременно должен быть один экземпляр, но вот что я делаю: я пытаюсь подключиться к недостижимому URL-адресу с тайм-аутом в 1 секунду. Когда я перехожу в свое приложение, возвращайтесь домой и возвращайтесь назад, у меня есть несколько журналов, говорящих «Подключение к http: // xx», а затем несколько журналов, говорящих «невозможно подключиться». Я получаю тот же результат с синхронизацией и асинхронными запросами, я не могу это объяснить –

 Смежные вопросы

  • Нет связанных вопросов^_^