【问题标题】:AsyncTask onPostExecute not running on main thread?AsyncTask onPostExecute 不在主线程上运行?
【发布时间】:2011-09-15 16:26:11
【问题描述】:

我的应用程序中有一些活动访问了网络服务。由于我不想阻止主线程,因此此代码位于 AsyncTask 中。但是,我不希望用户在调用 Web 服务时操作 Activity,因此在执行 AsyncTask 之前,我会显示一个 ProgressDialog,它会旋转并阻止屏幕。在 AsyncTask 的 onPostExecute 方法中,我做的第一件事就是关闭 ProgressDialog。

这应该可以防止用户在不真正阻塞主线程的情况下操作 Activity。

但是,我注意到 ProgressDialog 有几次从不被关闭并且用户被卡住了。 AsyncTask 已完成,onPostExcute 已执行,但 ProgressDialog 仍显示。 ProgressDialog 永远不会被解雇,并且用户被卡在屏幕上。他们唯一的选择是访问 Android 设置应用程序并强制停止我的应用程序。

有人知道为什么会这样吗?我能做些什么来解决它?

相关代码:

这就是我显示 ProgressDialog 和启动任务的方式:

mProgress = ProgressDialog.show(this, "", "Syncing...", true);
(new MyAsyncTask()).execute(intUserId);

这是任务的 onPostExcute。没有“@Override”

    protected void onPostExecute(Boolean result) {
        if (mProgress != null) {
            mProgress.dismiss();
            mProgress = null;
        }
    }

【问题讨论】:

  • 听起来像是调试器的工作
  • 你能粘贴你正在使用的代码的相关部分吗?它有时与您正在关闭的对话框的实例有关。我的意思是,旋转手机之类的操作可能会导致重新创建一个新对话框,有时您会忽略对话框的另一个引用。
  • 我已经用相关代码更新了主帖
  • 使用onPreExecute 将进度对话框保持在AsyncTask 内会更加清晰。

标签: android android-asynctask progressdialog


【解决方案1】:

检查一下:

  1. 确保您在 UI 线程上调用了 asynctack.execute()
  2. onPostExcute() 上使用@Override 以确保正确定义它。

【讨论】:

  • 我认为 onPostExecute 的定义是正确的,因为 Andrew 说这是一个间歇性错误。
  • 我认为从 UI 线程调用 asynctack.execute() 是一个重要的问题
【解决方案2】:

也许尝试在 onPreExecute() 方法中显示您的 ProgressDialog?

protected void onPreExecute() {
    mProgress = ProgressDialog.show(this, "", "Syncing...", true);
}

试一试,看看它是否有效。

【讨论】:

    【解决方案3】:

    Peter Knego 在 OP 下的评论中发布了以下链接。 CommonsWare 的解决方案似乎运作良好。

    Backround task, progress dialog, orientation change - is there any 100% working solution?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2016-12-30
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多