来自AsyncTask.doInBackground()的用户反馈?

时间:2013-03-08 20:54:25

标签: android android-asynctask

我有一个AsyncTask,可以播放ArrayList个音乐文件。在doInBackground方法中,我循环遍历ArrayList并逐个播放歌曲。我想在UI的TextView上添加一条状态消息,以指示正在播放的歌曲,但是获取错误只有创建视图层次结构的原始线程才能触及其视图。< / em>如果我只更新onPreExecute()onPostExecute()的UI小部件,则列表已经播放。有没有办法使用onProgressUpdate或其他AsyncTask方法来执行此操作?

3 个答案:

答案 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> {
.
.
.
}

按顺序排列的类型,例如:

  1. URL通过doInBackground
  2. 传递给execute
  3. Integer转到onProgressUpdate(通过publishProgress
  4. Long到达onPostExecute,也是doInBackground
  5. 的返回值

    doInBackground()中,您可以调用publishProgress(),然后在主线程上调用onProgessUpdate()(假设您在主线程上创建了AsyncTask)。

    使用link)下的参考文档中有一个完整的示例。