1

Я изменил свой манифест на целевой API 16 из-за вещи с помощью ActionBarSherlock, и с тех пор мой обработчик, который проверяет текущую песню, больше не работает. Он выдает исключение NetworkOnMainThreadException в строке, указанной ниже.Получение NetworkOnMainThreadException внутри runnable при таргетинге 3.0+

Что я делаю неправильно? Я думал, что у меня есть многопоточность.

Вот мой код:

handler = new Handler(); 

    updateSongTask = new Runnable() { 
     public void run() { 
      Log.d("asdf", "scraper started"); 
      Scraper scraper = new ShoutCastScraper(); // THIS LINE throws the exception 
      List<Stream> streams; 
      try { 
       streams = scraper.scrape(new URI(url)); 
       for (Stream stream : streams) {      
        Intent songIntent = new Intent(CUSTOM_INTENT); 

        String[] songAndArtist = songAndArtist(stream.getCurrentSong()); 
        songIntent.putExtra("song", songAndArtist[0]); 
        songIntent.putExtra("artist", songAndArtist[1]); 
        songIntent.putExtra("stationurl", url); 
        sendBroadcast(songIntent); 
        Log.d("asdf", "should send broadcast"); 

       } 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      handler.postDelayed(this, 5000); 
     } 
    }; 

    handler.postDelayed(updateSongTask, 0); 

ответ

5

postDelayed() говорит Android, чтобы запустить Runnable на главном потоке приложения после задержки. Он не запускает Runnable на фоне потока.

+0

Ох ... это будет иметь смысл! Как заставить его работать в другом потоке? –

+0

@ D_Steve595: Дамп «Runnable» и переключитесь на что-то еще. Кажется, вы хотите делать что-то периодически, поэтому рассмотрите 'Timer' и' TimerTask', которые используют фоновый поток. Или подстройте что-нибудь с помощью 'AsyncTask', если вам нужно обновить интерфейс. – CommonsWare

+0

Ух, что отстой, Хендлер казался таким изящным способом сделать это. О, хорошо, я посмотрю руководство по таймеру или что-то в этом роде. –

0

CommonsWare был прав. Я просто поместил ASyncTask внутри моего обработчика и переместил весь код обновления моей песни (рабочий) в метод doInBackground(). Отлично работает на всех версиях и не исключает сетевого исключения!