由于ActionBarSherlock的问题,我将我的Manifest更改为目标API 16,从那时起我检查当前正在播放的歌曲的处理程序不再有效。它在我标记为下面的行上抛出NetworkOnMainThreadException。
我做错了什么?我以为我的多线程设置正确。
这是我的代码:
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);
答案 0 :(得分:5)
postDelayed()
告诉Android在延迟后在主应用程序线程上运行Runnable
。它不会在后台线程上运行Runnable
。
答案 1 :(得分:0)
CommonsWare是对的。我只是在我的处理程序中放入一个ASyncTask,并将我的所有歌曲更新(工作者)代码移动到doInBackground()方法中。适用于所有版本,并且没有网络异常!