1

我有一个必须不断从网络或 MP3 流数据(ID3 标记)获取结果并将它们显示在其 TextViews 上的 Activity。

所以解析可以在播放流的Service中实现,也可以在解析文件的AsyncTask中实现。它必须在计时器上,并且仅在 Activity 可见时才加载数据。

自己解析是可以实现的,但是有什么办法不断的运行这个任务,更新Activity UI呢?

我看过一些链接,尝试了一些自己的代码,但它仅适用于 1 次启动。从该站点多次调用 AsyncTask 的示例不起作用(崩溃)。

请给出一个稳定的简单工作示例,即定时调用 AsyncTask 并不断更新 UI 或定时调用 Service 方法并更新 UI。

据我了解,必须在 onCreate 和 onResume 的 UI 线程中调用计时器?

谢谢。

更新的代码:(这里是更新 UI 的计时器的工作版本,需要使用 AsyncTask 工作进行测试)

doUpdate();   // in the UI onCreate

TimerTask updateTask;
     final Handler handler = new Handler();
     Timer timer = new Timer();

     public void doUpdate(){

     updateTask = new TimerTask() {
                  public void run() {
                  handler.post(new Runnable() {
                                 public void run() {
                                     Random r = new Random();
                                     int nm=r.nextInt(100-1) + 1;
                                     updatePlaylist(String.valueOf(nm));   //here we update the TextView

// BUT CALLING:
// new PlayList(PlayerActivity.this).execute(this); 
// doesn't work! It's an AsyncTask.
                                 }
                        });
                 }};
          timer.schedule(updateTask, 0, 2000);
          }

那么也许新的 AsyncTask 对象代码行是错误的?

     class PlayList extends AsyncTask<Activity, Void, String> {


    private PlayerActivity act;

    public PlayList(Activity activity) {
        this.act = (PlayerActivity) activity;
    }


    protected String doInBackground(Activity... activities) {


        String result;

        Random r = new Random();
        int num=r.nextInt(100-1) + 1;

        result=String.valueOf(num);
        //result=act.mp3Service.getPlaylist(); // will work later

        return result;

    }


    protected void onPostExecute(String result) {

            act.updatePlaylist(result);


    }


}
4

1 回答 1

1

很难说确切的整体解决方案应该是什么,但我建议您使用在服务中运行的单独线程。您可能会在 AsyncTask 上崩溃,因为您尝试多次使用 AsyncTask 对象。你不能那样做;每次运行后台任务时都必须创建一个新对象。

于 2013-07-12T23:10:09.473 回答