20

在我的应用程序中,我正在AsyncTask按照 Android 教程的建议做一些紧张的工作,并ProgressDialog在我的主要活动中显示:

dialog = ProgressDialog.show(MyActivity.this, "title", "text");
new MyTask().execute(request);

然后稍后MyTask我将结果发布回活动:

class MyTask extends AsyncTask<Request, Void, Result> {

    @Override protected Result doInBackground(Request... params) {
        // do some intense work here and return result
    }

    @Override protected void onPostExecute(Result res) {
        postResult(res);
    }
}

在结果发布时,在主要活动中我隐藏了对话框:

protected void postResult( Result res ) {
    dialog.dismiss();
    // do something more here with result...
}

所以这里一切正常,但我想以某种方式更新进度对话框,以便能够向用户显示一些真正的进度,而不是只是虚拟的“请稍候......”消息。我可以以某种方式访问MyTask.doInBackground​​所有工作完成的进度对话框吗?

据我了解,它作为单独的线程运行,因此我无法从那里与主要活动“交谈”,这就是为什么我onPostExecute用来将结果推回给它的原因。但问题是onPostExecute只有在所有工作都已经完成并且我想在做某事的过程中更新对话框的进度时才会调用它。

任何提示如何做到这一点?

4

2 回答 2

42

AsyncTask 具有方法onProgressUpdate(Integer...),您可以调用例如每次迭代或每次进度完成时doInBackground()通过调用publishProgress().

有关更多详细信息,请参阅文档

于 2011-01-04T08:52:46.827 回答
1

您可以从 AsyncTask 的方法进行更新,该方法可以通过调用 YOUR_PROGRESS 的数据类型onProgressUpdate(YOUR_PROGRESS)doInBackground方法中调用,可以从定义publishProgress(YOUR_PROGRESS)AsyncTask<Int, YOUR_PROGRESS_DATA_TYPE, Long>

于 2019-02-27T11:55:55.783 回答