由於ActionBarSherlock的原因,我將Manifest更改爲目標API 16,此後,用於檢查當前播放歌曲的處理程序不再有效。它會在下面標記的行上引發NetworkOnMainThreadException。在定位3.0+時獲取NetworkOnMainThreadException在運行時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
呃..這很糟糕,Handler似乎是這樣做的一種優雅的方式。哦,我會查找計時器指南或其他內容。 –