AsyncTask onPostExecute不在主线程上运行?

4
我在我的应用程序中有几个与 web 服务交互的活动。由于我不想阻塞主线程,所以这段代码在 AsyncTask 中实现。但是,在调用 Web 服务之前,我不希望用户操作 Activity,因此我会显示一个旋转并阻止屏幕的 ProgressDialog。在 AsyncTask 的 onPostExecute 方法中,我首先会关闭 ProgressDialog。
这样做可以防止用户操纵 Activity,而无需实际阻塞主线程。
然而,我注意到有一些情况下 ProgressDialog 没有被关闭,用户就进入了困境。AsyncTask 已经完成,onPostExecute 已经执行,但是 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;
        }
    }

听起来像是调试器的工作。 - Peter Knego
2
你能粘贴一下你正在使用的代码的相关部分吗?这有时与你正在关闭的对话框实例有关。我的意思是,比如旋转手机可能会导致重新创建一个新的对话框,有时你会关闭另一个对话框的引用。 - Cristian
1
请参阅此帖子:https://dev59.com/t2865IYBdhLWcg3wa980 - Peter Knego
我已经更新了主贴并附上了相关代码。 - Andrew
1
最好在AsyncTask中使用onPreExecute来显示进度对话框,这样可以使代码更加简洁。 - Che Jami
你在logcat中看到任何错误吗?这些错误是否表明你的ProgressDialog正在尝试从不同的线程访问? - hooked82
3个回答

1

请检查以下内容:

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

1
我认为onPostExecute已经正确定义了,因为安德鲁说这是一个间歇性的错误。 - Cristian
我认为从UI线程调用asynctack.execute()是一个重要的问题。 - Aksel Fatih

0
也许尝试在onPreExecute()方法中显示您的ProgressDialog?
protected void onPreExecute() {
    mProgress = ProgressDialog.show(this, "", "Syncing...", true);
}

试一试,看看是否有效。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接