2013-03-08 80 views
0

我有一個AsyncTask,其中需要播放ArrayList的音樂文件。在doInBackground方法中,我遍歷ArrayList並逐個播放歌曲。我想在UI的TextView上放置一個狀態消息或其他信息來指示正在播放哪首歌曲,但獲取錯誤只有創建視圖層次結構的原始線程才能觸摸其視圖。如果我只更新onPreExecute()onPostExecute()的UI小部件,該列表已被播放。有沒有辦法使用onProgressUpdate或其他AsyncTask方法來做到這一點?來自AsyncTask.doInBackground()的用戶反饋?

+0

你可以發佈你的AsyncTask聲明嗎?不是全部,而只是公開課......擴展AsyncTask'行,和構造函數(如果有的話)? – 2013-03-08 21:08:35

回答

3

這當然是可能的。這裏有一個簡單的例子,如果你有你想顯示歌曲名,專輯名和歌手名(我還沒有全面實施的AsyncTask,只是部分相關onProgressUpdate)字符串:

private class myAsyncTask extends AsyncTask<Void, String, Void> 
{ 
    protected Void doInBackground(Void... voids) 
    { 
     //Get some list of songs, named songs 
     for(Song song in songs)//This is the loop where you're playing your songs 
     { 
      publishProgress(song.name, song.album, song.artist); 
      //Play the song and wait for it to finish 
     } 
     return null; 
    } 

    protected void onProgressUpdate(String... songData) 
    { 
     //Assuming three text views exist to display your data 
     nameTextView.setText(songData[0]); 
     albumTextView.setText(songData[1]); 
     artistTextView.setText(songData[2]); 
    } 
} 

重要的事情需要注意的是尖括號中的第二類是onProgressUpdate的參數類型,並且publishProgress在doInBackground中被調用以觸發onProgressUpdate。您可以在onProgressUpdate中找到的大多數示例都涉及增加ProgressBar上的填充,但該方法在UI線程上運行,並且可以與AsyncTask可以訪問的任何視圖進行交互。如果您仍然遇到麻煩,請發佈當前的AsyncTask,以便將此示例類整合到您已有的內容中。 Here are the docs for AsyncTask for more information.希望這有助於!

+0

很好的答案!這非常有幫助,謝謝! – wufoo 2013-03-08 21:24:20

1

您應該可以使用onProgressUpdate()從UI線程執行更新。或者,你可以這樣做(當不使用AsyncTask時,這是典型的)。

後,更新你這樣的UI在UI線程上的事件:它會在UI線程上運行,因此它可以訪問和更新視圖

view.post(new Runnable() { 
    @Override 
    public void run() { 
     // Update your UI 
    } 
}); 

1

是的。

當你decalre您的AsyncTask,您decalre即進入任務的各部分的類型:

public class MyTask extends AsyncTask<URL,Integer,Long> { 
. 
. 
. 
} 

類型的順序,這個例子:

  1. URL被傳遞給doInBackground (通過publishProgress
  2. Long到達onPostExecute,也doInBackground

返回值在你doInBackground(),你可以調用publishProgress(),這將反過來在主線程中調用onProgessUpdate()(假設您創建的主線程上的AsyncTask)。

有一個在參考文檔下用法link)一個完整的例子。

+0

偉大的信息,謝謝邁克。 – wufoo 2013-03-08 21:24:48