我有一个AsyncTask
,可以播放ArrayList
个音乐文件。在doInBackground
方法中,我循环遍历ArrayList并逐个播放歌曲。我想在UI的TextView
上添加一条状态消息,以指示正在播放的歌曲,但是获取错误只有创建视图层次结构的原始线程才能触及其视图。< / em>如果我只更新onPreExecute()
和onPostExecute()
的UI小部件,则列表已经播放。有没有办法使用onProgressUpdate
或其他AsyncTask
方法来执行此操作?
答案 0 :(得分: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
的参数类型,并且在doInBackground中调用publishProgress
来触发onProgressUpdate
。您将在onProgressUpdate中找到的大多数示例都涉及增加ProgressBar上的填充,但该方法在UI线程上运行,并且可以与AsyncTask可以访问的任何视图进行交互。如果您仍遇到问题,请发布当前的AsyncTask,以便更轻松地将此示例类集成到您已有的内容中。 Here are the docs for AsyncTask for more information.希望这会有所帮助!
答案 1 :(得分:1)
您应该能够使用onProgressUpdate()从UI线程执行更新。或者,您可以这样做(这在不使用AsyncTask时是典型的)。
在UI线程上发布一个更新UI的事件,如下所示:
view.post( new Runnable() {
@Override
public void run() {
// Update your UI
}
});
它将在UI线程上运行,以便它可以访问和更新视图。
答案 2 :(得分:1)
是的。
当您对AsyncTask进行十分转换时,您会对进入任务的每个部分的类型进行十分转换:
public class MyTask extends AsyncTask<URL,Integer,Long> {
.
.
.
}
按顺序排列的类型,例如:
URL
通过doInBackground
execute
Integer
转到onProgressUpdate
(通过publishProgress
)Long
到达onPostExecute
,也是doInBackground
在doInBackground()
中,您可以调用publishProgress()
,然后在主线程上调用onProgessUpdate()
(假设您在主线程上创建了AsyncTask)。
使用(link)下的参考文档中有一个完整的示例。