1

由於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); 

回答

5

postDelayed()告訴Android上的延遲後運行的主應用程序線程上Runnable。它不會在後臺線程上運行Runnable

+0

噢..這是有道理的!我如何讓它在不同的線程上運行? –

+0

@ D_Steve595:轉儲'Runnable'並切換到別的東西。您似乎想要定期執行某些操作,因此請考慮使用後臺線程的「Timer」和「TimerTask」。或者,如果您需要更新用戶界面,請使用'AsyncTask'來設置某些內容。 – CommonsWare

+0

呃..這很糟糕,Handler似乎是這樣做的一種優雅的方式。哦,我會查找計時器指南或其他內容。 –

0

CommonsWare是對的。我只需在處理程序中放入一個ASyncTask,並將所有歌曲更新(工作)代碼移入doInBackground()方法。適用於所有版本,並且沒有網絡異常!