从 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&lt;Int, YOUR_PROGRESS_DATA_TYPE, Long&gt; 定义

【讨论】:

以上是关于从 AsyncTask 更新 Activity 中的进度对话框的主要内容,如果未能解决你的问题,请参考以下文章

从 asyncTask doInBackground 调用 Activity

Android - 将数据从 AsyncTask 传递到 Activity

为啥Android的AsyncTask不适合执行长时间操作的任务

如何从 Android AsyncTask 更改活动 UI?

如何将 AsyncTask 从 Adapter onBindViewHolder() 移动到 Activity onChildEventListener

从 Activity 调用时,另一个 AsyncTask 类中的 ProgressDialog 未显示