【问题标题】:Run Service method or AsyncTask by timer and getting result in UI通过计时器运行 Service 方法或 AsyncTask 并在 UI 中获取结果
【发布时间】:2013-07-12 22:08:55
【问题描述】:

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

所以解析可以在播放流的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);


    }


}

【问题讨论】:

  • 如果它只需要持续到Activity 的生命周期,那么AsyncTask 应该没问题。否则,服务可能会更好。发布您尝试过的内容,我们可以帮助您找出问题所在。根据您的需要,可以在任何Activity 方法中设置计时器。
  • 我试过stackoverflow.com/questions/6531950/… 奇怪,虽然它有 19 票,但它不起作用。
  • 每个代码都不一样。我没有很好地检查这个问题,但它可能是它需要做的很好的代码。如果没有看到您的代码和您的 logcat,就无法确定它是否适合您或您遇到了什么问题
  • 我已经更新了代码。计时器本身可以工作,但在其中调用新的 AsyncTask 失败
  • 错误是:Activity已经泄露了原来绑定在这里的服务连接:或者执行doInBackground()时出错

标签: android user-interface service timer android-asynctask


【解决方案1】:

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

【讨论】:

  • 是的,问题是如何通过计时器启动新的 AsyncTask 对象。
猜你喜欢
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多