2012-02-01 3 views
4

Я получаю NetworkOnMainThreadException в моем классе Service, который по своей природе не имеет смысла, потому что Сервисы - это фоновые процессы, насколько я понимаю.NetworkOnMainThreadException in Service

В методе «Сервис» я обращаюсь к статическому вспомогательному методу для загрузки данных. Я также использую DefaultHttpClient.

Что здесь происходит?

+0

Можете ли вы показать код для облегчения расследования? – OleGG

+0

Посмотрите мое сообщение о ** ['NetworkOnMainThreadException'] (http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html) **. Это объясняет, почему это может произойти. –

ответ

5

onStartCommand() работает на потоке пользовательского интерфейса в Service. Попробуйте использовать IntentService или, альтернативно, использовать любой другой метод нитей в Service (Handler/Runnable, AsyncTask).

+0

Не разрешено вызывать AsyncTask в сервисе, потому что он должен быть выполнен с основного протектора, верно? – bgplaya

+0

@bgplaya Вы можете определенно использовать 'AsyncTask' в' Сервис'. Как я сказал выше, регулярная 'Сервис' работает в основном потоке (UI). –

+0

Я должен пересмотреть свой код, но, похоже, у меня были проблемы с использованием 'AsyncTask' в' Service': возможно, я просто вызвал его не в 'onStartCommand()' – bgplaya

0

Сервисные обратные вызовы выполняются в основном потоке, также как и в потоке пользовательского интерфейса. Если вы хотите выполнять фоновые работы, запустите Thread или используйте IntentService onHandleIntent (Intent i).

0

Исключение, возникающее при попытке приложения выполнить сетевую операцию в своем основном потоке.

Это делается только для приложений, предназначенных для сотового SDK или выше. Приложениям, использующим более ранние версии SDK, разрешено создавать сети в своих основных потоках цикла событий, но в значительной степени обесценивается .

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

0

я просто решить эту проблему с помощью этого:

public int onStartCommand(Intent intent, int flags, int startId) { 

    RefreshDBAsync task = new RefreshDBAsync(this); 
    task.execute(); 

    return START_STICKY; 
} 

RefreshDBAsync делает запрос на сервер через каждые 5 минут