Структура сервиса, использование HttpClient и ANR - PullRequest
0 голосов
/ 23 февраля 2012

Хорошо, позвольте мне объяснить, что я делаю, и тогда у меня есть пара вопросов.

Объяснение

У меня есть приложение, над которым я работаюбудет использовать сервис для проверки обновлений на моей веб-странице каждые 1-10 минут.Таким образом, в ACTION_BOOT_COMPLETED MyReceiver (Broadcast Receiver) запускается, и если это трансляция ACTION_BOOT_COMPLETED, он запускает службу BootService.BootService затем устанавливает AlarmService, который запускает MyReceiver, и затем BootService завершается.Когда в MyReceiver поступает сигнал тревоги, он запускает другую службу с именем UpdateService, которая будет проверять Интернет с любым интервалом, установленным BootService.

У меня есть служба BootService, потому что каждый раз, когда мое приложение запускается, оно запускает BootService.чтобы убедиться, что AlarmService работает на тот случай, если по какой-либо причине он будет прерван.

Когда я делаю свои запросы HTTPClient, я хочу, чтобы он был защищен входом в систему, поэтому я пытался сделать это при каждом запуске BootService.инициирует запрос HTTPClient на мой веб-сайт, войдет в систему и сохранит идентификатор сеанса, который я буду использовать в UpdateService.Однако, когда я помещаю запрос HTTPClient в BootService, я получаю ANR (приложение не отвечает).Я попытался поместить запрос HTTPClient в AsyncTask, и все же у меня есть проблемы с ним.

Вопросы

  1. Было бы лучше, если бы я убралс BootService и вместо этого просто MyReceiver установить AlarmService.И всякий раз, когда кто-то загружает приложение, только что отправившее широковещательную рассылку, чтобы снова вызвать тревогу?

  2. Что может быть причиной всей задержки во время запроса HTTPClient, что оно блокирует мою программу и вынуждаетANR?Как я мог правильно реализовать мой запрос HTTPClient, чтобы он не задерживал мою службу?

  3. Любые хорошие примеры метода входа в систему / хранилища cookie.А сервис, который позже использует идентификатор сеанса для выполнения будущих запросов?

1 Ответ

0 голосов
/ 24 февраля 2012

Когда я делаю свои запросы HTTPClient, я хочу, чтобы он был защищен при входе в систему, поэтому при попытке запуска BootService он запускает запрос HTTPClient на мой веб-сайт, входит в систему и сохраняет идентификатор сеанса, который я буду использовать в UpdateService.

Если веб-служба не допускает бесконечной продолжительности сеанса, выполнение этой работы может быть сложным. Я предлагаю вам делать логин при каждом обновлении.

Однако, когда я помещаю запрос HTTPClient в BootService, я получаю ANR (приложение не отвечает).

Это означает, что вы пытались выполнить слишком много работы в onStartCommand(), или onCreate(), или onDestroy(), или onBind(). Все эти методы вызываются в главном потоке приложения, поэтому вы не можете выполнять там значительную работу.

Будет ли лучше, если я покончу с BootService и вместо этого просто настрою MyReceiver на AlarmService.

Да.

Что может быть причиной всей задержки во время запроса HTTPClient, что он блокирует мою программу и вызывает ANR?

Сетевой ввод / вывод может быть медленным.

Как я мог правильно реализовать мой запрос HTTPClient, чтобы он не задерживал мою службу?

Используйте IntentService и выполните сетевой ввод / вывод в onHandleIntent().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...