2013-03-08 57 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