Я изменил свой манифест на целевой 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);
Ох ... это будет иметь смысл! Как заставить его работать в другом потоке? –
@ D_Steve595: Дамп «Runnable» и переключитесь на что-то еще. Кажется, вы хотите делать что-то периодически, поэтому рассмотрите 'Timer' и' TimerTask', которые используют фоновый поток. Или подстройте что-нибудь с помощью 'AsyncTask', если вам нужно обновить интерфейс. – CommonsWare
Ух, что отстой, Хендлер казался таким изящным способом сделать это. О, хорошо, я посмотрю руководство по таймеру или что-то в этом роде. –