在我的应用程序中,我在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
仅在所有工作都已完成时被调用,并且我想在做某事的过程中更新对话框的进度。
任何提示如何做到这一点?
AsyncTask有方法onProgressUpdate(Integer...)
,您可以调用每个迭代,例如,或者每次在doInBackground()
期间通过调用publishProgress()
完成进度。
有关更多详细信息,请参阅docs
你可以从AsyncTask的方法onProgressUpdate(YOUR_PROGRESS)
更新,可以通过调用doInBackground
从publishProgress(YOUR_PROGRESS)
方法调用,可以从AsyncTask<Int, YOUR_PROGRESS_DATA_TYPE, Long>
定义YOUR_PROGRESS的数据类型