AsyncTask onPostExecute没有在主线程上运行?

时间:2011-09-15 16:26:11

标签: android android-asynctask progressdialog

我的应用上有一些活动可以访问网络服务。由于我不想占用主线程,因此该代码位于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;
        }
    }

3 个答案:

答案 0 :(得分:1)

检查一下:

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

答案 1 :(得分:0)

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

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

给它一个镜头,看它是否有效。

答案 2 :(得分:0)

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

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