2011-09-15 36 views
4

我的应用程序中有一些活动会触及Web服务。由于我不想撑起主线程,所以这段代码在AsyncTask中。但是,我不希望用户在调用Web服务时操作Activity,因此在执行AsyncTask之前,我会显示一个ProgressDialog,它会旋转并阻止屏幕。在AsyncTask的onPostExecute方法中,我所做的第一件事是关闭ProgressDialog。AsyncTask onPostExecute没有在主线程上运行?

这应该阻止用户在不实际阻塞主线程的情况下操作活动。

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

有没有人有任何想法,为什么会发生这种情况?我能做些什么来解决它?

相关代码:

我这是怎么显示ProgressDialog和启动任务:

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

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

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

听起来像是调试 –

+2

职位,您可以粘贴您正在使用的代码的相关部分?它有时与您所忽视的对话框的实例有关。我的意思是,像旋转手机这样的东西可能会导致重新创建一个新的对话框,有时候你会忽略对话框的另一个参考。 – Cristian

+1

也看到这篇文章:http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is-there-any-100-working –

回答

1

检查:

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

我认为'onPostExecute'被正确定义,因为安德鲁说它是一个间歇性的错误。 – Cristian

+0

我认为从UI线程调用asynctack.execute()是一个重要问题 – Fatih

0

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

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

给一个镜头,看看它是否工作。

相关问题