2014-01-24 3 views
0

Я новичок в программировании для Android. Попытка получить полезный набор данных из web json (сетевая задача) и проанализировать его. Итак, я выбираю для этого Service, для того, чтобы сделать фоновое задание. Как правильно установить повторяющуюся задачу с Handler.postDelayed(runnable, interval) не в потоке main?Runnable in service работает в основной теме

Помогите мне разобраться в этом?

+0

Вам не разрешено выполнять сетевые операции в основном потоке. Попробуйте использовать отдельный поток. – Keppil

+0

Что вы пытаетесь достичь? Этот код выглядит так, будто вы пытаетесь сделать что-то в фоновом режиме каждые пять секунд. Это верно? Если да, когда эта работа начинается, и когда эта работа перестанет работать? – CommonsWare

+0

Я пытаюсь получить некоторые данные json с веб-страницы и проанализировать ее. Да, достаточно 5 сек для анализа веб-страницы json. По крайней мере, этого достаточно для androidVM. – Outofdate

ответ

0

Исключение составляет NetworkOnMainThreadException. Вы не должны создавать сети в основном потоке. Существует много решений для этой проблемы, так как одним из них является AsyncTask.

Вот пример из AndroidDevelopers:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

Другой вариант заключается в использовании Service. Here вы можете найти хороший учебник по услугам.

+1

«AsyncTask» редко является правильным ответом в сервисе, поскольку точка, стоящая за «AsyncTask», позволяет выполнить некоторую работу по основному потоку приложения, который почти никогда не нужен в службе. – CommonsWare

+0

Хорошая точка. Я отредактировал свой ответ. –

+0

Благодарим за сообщение. Но мысль, что IntentService работает в другом потоке, и я могу обходиться без AsynTask. – Outofdate

0

Одним из основных способов программирования Android является то, что поток пользовательского интерфейса (то есть тот, который взаимодействует с пользователем) должен быть как можно более свободным. Это означает, что если вы объявили о сетевом соединении в потоке пользовательского интерфейса, вы свернете его, и пользователь получит хороший ANR (Android не отвечает).

Для задач, включает в себя сетевые подключения, я рекомендовал бы один из них:

  • Если ваша задача сети ограничена во времени и заканчивается в течение короткого времени после запуска, я рекомендую использовать AsyncTask.

  • Если вам требуется сетевое соединение с неопределенным сроком времени или гнездо forever-loop, и поэтому используйте Service, они предназначены именно для этого.

0

NetworkOnMainThreadException, которое выбрасывается, когда приложение пытается выполнить операцию сети на ее главном потоке.

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

Так что используйте отдельный поток для сетевых операций.

Для получения более подробной информации посетите developer android site.

1

IntentService намерения работают на фоне рабочего потока.

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

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

+0

Я обновил основную статью. – Outofdate

Смежные вопросы