【问题标题】:Android - Problem with AsyncTaskAndroid - AsyncTask 的问题
【发布时间】:2011-01-19 08:51:18
【问题描述】:

我需要一个一个或一次全部调用 5 次 web 服务(因为有 5 个不同的参数)。完成特定调用后,应在后台将文本视图更新为:“第一次完成”、“第二次完成”等。

TextView 值应该在后台更新。

我该怎么办?我知道 AsyncTask 的概念,但我很困惑,我应该写 5 个 AsyncTask,然后为每个我写 execute() 方法来执行 AsyncTask?

我只成功了一次调用,因为我在 postExecute() 方法中设置了“第一次完成”。但对 5 次调用感到困惑。

请给我一个更好的方法或确切的解决方案。

【问题讨论】:

  • 如果webservice对5次调用都采用相同类型的参数,则可以使用一个AsyncTask创建5个异步任务对象并执行它们并更新异步任务执行后的textview。

标签: android android-asynctask


【解决方案1】:

您只需要 1 个 AsyncTask,您必须在 doInBackground() 中执行所有 5 个调用,并且每次完成一个调用时,publishProgress 传递例如已完成调用的编号,然后,最后做任何您需要的在onPostExecute

一个简单的方法:

private class ServiceCallTask extends AsyncTask<String, Integer, Void> {

    protected void onPreExecute() {
        //prepare whatever you need
        myTextField.setText("starting calls");
    }

    protected Void doInBackground(String... params) {
        //process params as you need and make the calls
        doCall1();
        publishProgress(1); //this calls onProgressUpdate(1)
        doCall2();
        publishProgress(2);
        doCall3();
        publishProgress(3);
        doCall4();
        publishProgress(4);
        doCall5();
        publishProgress(5);
        return;
    }

    protected void onProgressUpdate(Integer... progress) {
        //this runs in UI thread so its safe to modify the UI
        myTextField.append("finished call " + progress);
    }

     protected void onPostExecute(Void unused) {
        myTextField.append("all calls finished");
    }
}

【讨论】:

  • @maid450 让我检查并实现这种方式。感谢您的快速支持。
  • 我是即时编写的,现在无法测试,所以可能存在一些小的语法错误,如果您有问题,请告诉我
  • @maid450 非常感谢您的代码,但有一个问题:我在 onPreExecute() 中调用了 Progressbar.show() 方法,并且在 onPostExecute() 方法中编写了 Progressbar.dismiss() 方法。它在 onPostExecute() 方法下显示黄线。(表明它从未在本地使用)这就是为什么我认为 ProgressBar 没有被解雇。
  • 确保您保留对 ProgressBar 的引用,当您调用 .show() 然后调用 .dismiss() 时获得相同的引用。我通常将 ProgressBar 引用存储在私有类成员中,并在需要时显示/关闭它。
  • 我刚刚更改了 onPostExecute(无效未使用),它工作正常。我的代码是:protected void onPostExecute(Void used) { try { if(Dialog.isShowing()) { Dialog.dismiss(); } } 捕捉(异常 e){ } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
相关资源
最近更新 更多