从 AsyncTask 更新 Activity 中的进度对话框
Posted
技术标签:
【中文标题】从 AsyncTask 更新 Activity 中的进度对话框【英文标题】:Updating progress dialog in Activity from AsyncTask 【发布时间】:2011-06-03 06:36:26 【问题描述】:在我的应用程序中,我正在按照 android 教程的建议在 AsyncTask
中做一些紧张的工作,并在我的主要活动中显示 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
仅在所有工作都已完成时才被调用,我想在做某事的过程中更新对话框的进度。
任何提示如何做到这一点?
【问题讨论】:
【参考方案1】:AsyncTask 具有方法onProgressUpdate(Integer...)
,例如,您可以调用每次迭代或每次在doInBackground()
期间通过调用publishProgress()
完成进度时。
更多详情请参考docs
【讨论】:
【参考方案2】:您可以从 AsyncTask 的方法 onProgressUpdate(YOUR_PROGRESS)
更新,该方法可以通过调用 publishProgress(YOUR_PROGRESS)
从 doInBackground
方法调用
YOUR_PROGRESS 的数据类型可以从AsyncTask<Int, YOUR_PROGRESS_DATA_TYPE, Long>
定义
【讨论】:
以上是关于从 AsyncTask 更新 Activity 中的进度对话框的主要内容,如果未能解决你的问题,请参考以下文章
从 asyncTask doInBackground 调用 Activity
Android - 将数据从 AsyncTask 传递到 Activity
为啥Android的AsyncTask不适合执行长时间操作的任务
如何从 Android AsyncTask 更改活动 UI?
如何将 AsyncTask 从 Adapter onBindViewHolder() 移动到 Activity onChildEventListener