Служба Android не может устанавливать HTTP-соединения, пока Activity не выполняет HTTP-соединения - PullRequest
0 голосов
/ 06 мая 2010

Вот мой пост:

Я пытаюсь сделать себя максимально понятным:

  1. Описание классов в моем приложении
  2. Описание архитектуры кода (Сервисом и Деятельностью)
  3. Описание того, что должно произойти
  4. Описание того, что на самом деле происходит
  5. Logcat
  6. Исходный код

Описание приложений классов

У меня в заявке:

  • служба, запускаемая при загрузке и управляемая MAJService классом
  • деятельность, которой управляет ConsoNRJ класс
  • рабочий класс, который будет получать HTML-страницы по HTTP, который называется MAJDonnees
  • вспомогательный класс с именем InfosConso, который создает экземпляр MAJDonnees работника.

Описание обработки

Когда служба запускается, она будет:

  • создать InfosConso объект
  • этот InfosConso объект создаст MAJDonnees
  • этот MAJDonnees объект будет выполнять HTTP-запросы, используя HttpURLConnection

Деятельность делает почти то же самое:

  • создать InfosConso объект
  • этот InfosConso объект создаст MAJDonnees
  • этот MAJDonnees объект создаст AsyncTask, а затем выполнит HTTP-запросы, используя HttpURLConnection

Вы можете увидеть график, который может помочь вам понять мой код:
code.google.com/p/consonrj/wiki/CodeStructure


Что должно произойти

Поскольку Activity и Служба в основном используют один и тот же код (в классе MAJDonnees), они должны вести себя точно так же: извлекать HTML-страницы и анализировать их

Что на самом деле происходит

При запуске из службы HttpURLConnections возвращает неверный результат при обработке в MAJDonnees. Экземпляр HttpURLConnections с именем h дает неверный ответ HTTP: h.getResponseCode() возвращает -1.
Я не знаю, как получить больше отладочной информации.

Однако, если действие запущено, соединения HTTP работают во время обработки в MAJDonnees, Indeede h.getResponseCode() возвращает 200 (HTTP 200 OK).

ТО Если служба снова запустится (планируется запускать каждые x минут), HTTP-соединения будут работать!


Logcat

Сначала можно запустить logcat службы, затем действие, затем снова службу и посмотреть поведение.
http://pastebin.com/DGc8fym2
Извините, это по-французски, надеюсь, вы все еще можете догадаться! :)

Исходный код

Если хотите, можете посмотреть весь источник по адресу:
code.google.com/p/consonrj/source/browse/#svn/trunk


Надеюсь, вы поможете мне отладить это! Моему сервису нужно получать данные из Интернета при запуске устройства и каждые x часов / дней, и не нужно, чтобы действие запускалось первым!

Спасибо.

1 Ответ

0 голосов
/ 07 мая 2010

Большое спасибо за ваш совет, Брэд.

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

На самом деле действие использует Compteкласс, который загружает учетные данные пользователя из файлов в памяти телефона, а служба этого не сделала.Таким образом, у службы не было учетных данных пользователя для входа на страницу HTML.Таким образом, сервис отправлял запрос на вход с пустыми учетными данными, пока активность не загрузила их.

Теперь, когда служба также загружает учетные данные, используя класс Compte, она работает хорошо.Мне очень жаль, что я не стал более тщательно исследовать мое приложение.

В любом случае, спасибо, Брэд!Очень ценится.

...