android.os.NetworkOnMainThreadException в услуга в отделен процес

В ICS получавам грешка android.os.NetworkOnMainThreadException, когато използвам UrlConnection - въпреки че правя тази заявка в услуга, която работи на свой собствен процес и беше извикана асинхронно, за да се направи чрез Messenger.

Промяната на StrictPolicy няма ефект, все още получавам грешката.

Какво мога да направя?

редактиране: тази услуга работи в отделен процес - има различен pid и всичко останало.


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


Отговори (2)


Услугите все още работят в основната нишка, съгласно документацията:

Имайте предвид, че услугите, подобно на други обекти на приложения, се изпълняват в основната нишка на техния хостинг процес. Това означава, че ако вашата услуга ще извършва операции, натоварващи процесора (като възпроизвеждане на MP3) или блокиращи (като работа в мрежа), тя трябва да създаде собствена нишка, в която да върши тази работа. Повече информация за това можете да намерите в Процеси и нишки. Класът IntentService е наличен като стандартна реализация на услуга, която има своя собствена нишка, където планира работата си да бъде свършена.

Следователно за дълго изпълняващи се задачи (като например използване на 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