android.os.NetworkOnMainThreadException в службе в отдельном процессе

В ICS я получаю ошибку android.os.NetworkOnMainThreadException при использовании UrlConnection, хотя я делаю этот запрос в службе, которая работает в своем собственном процессе и была вызвана асинхронно для выполнения через Messenger.

Изменение StrictPolicy не дало никакого эффекта, я все еще получаю сообщение об ошибке.

Что я могу сделать?

редактировать: эта служба работает в отдельном процессе - имеет другой pid и все такое.


person Vadim Peretokin    schedule 08.04.2012    source источник


Ответы (2)


Службы по-прежнему работают в основном потоке, как указано в документации:

Обратите внимание, что службы, как и другие объекты приложения, выполняются в основном потоке своего хост-процесса. Это означает, что если ваша служба собирается выполнять какие-либо операции с интенсивным использованием ЦП (например, воспроизведение MP3) или блокировку (например, сетевые операции), она должна создать собственный поток, в котором будет выполняться эта работа. Дополнительную информацию об этом можно найти в разделе Процессы и потоки. Класс IntentService доступен как стандартная реализация Service с собственным потоком, в котором он планирует выполнение своей работы.

Поэтому для длительных задач (таких как использование UrlConnection) вы должны либо использовать что-то вроде IntentService или создайте новый поток самостоятельно.

person AdamK    schedule 08.04.2012
comment
Эта служба работает в отдельном процессе. - person Vadim Peretokin; 09.04.2012
comment
Не имеет значения, выполняется ли он в отдельном процессе от других ваших действий или служб — любой код, работающий непосредственно в службе, все равно будет выполняться в основном потоке этого процесса. Если вместо этого вы используете IntentService, то для вас будет автоматически создан новый поток для кода, выполняемого в onHandleIntent(). - person AdamK; 09.04.2012
comment
Итак, вы говорите, что задача, запущенная в таймере службы, которая находится в совершенно отдельном процессе от основного, повлияет на поток пользовательского интерфейса основных процессов? Я не заметил такого поведения, мой пользовательский интерфейс не зависает во время работы в сети... - person Vadim Peretokin; 10.04.2012
comment
Нет, это не повлияет на основной поток пользовательского интерфейса процесса. У него есть собственный отдельный основной поток, и, поскольку этот отдельный процесс не имеет пользовательского интерфейса, он не окажет негативного влияния на что-либо, что видит пользователь. Однако доступ к сети в этом потоке по-прежнему будет вызывать исключение, которое вы видите: если вы нацелены на HC+, сетевые операции не разрешены в основном потоке любого процесса (см. developer.android.com/reference/android/os/). - person AdamK; 10.04.2012
comment
Хорошо, спасибо, что нашли время объяснить. Я предполагаю, что тогда я вставлю каждый из них в поток и смогу сделать их асинхронно в то же время. - person Vadim Peretokin; 10.04.2012
comment
Я вспомнил, что таймеру требуется аргумент для работы в режиме демона — раньше я его отключал. Я подозреваю, что это покончит с предупреждением. - person Vadim Peretokin; 17.04.2012

Делайте сетевые вещи в Thread там. это исключение создается для предотвращения некоторых проблем, таких как зависание пользовательского интерфейса (из-за сетевой работы это может занять некоторое время).

person Keyhan Asghari    schedule 08.04.2012