Android 在AsyncTask中取消ProgressDialog时出错

Android 在AsyncTask中取消ProgressDialog时出错,android,android-asynctask,android-dialog,Android,Android Asynctask,Android Dialog,我有一个完全独立的类,它扩展了AsyncTask,我使用它来执行html get,所以它不会冻结UI。在AsyncTask的构造函数中,Im传递活动的上下文,该上下文调用任务的.execute(),以便在htmlget运行时显示ProgressDialog。第一个问题出现了:当旋转手机时,当前视图被破坏,当应用程序到达对话框的.disclose()时,它崩溃了,因为它所连接的视图不再存在。在95%的案例中,我确实解决了这个问题,但是在剩下的5%中,仍然存在一个问题。我最初的解决方案是在htmlg

我有一个完全独立的类,它扩展了AsyncTask,我使用它来执行html get,所以它不会冻结UI。在AsyncTask的构造函数中,Im传递活动的上下文,该上下文调用任务的.execute(),以便在htmlget运行时显示ProgressDialog。第一个问题出现了:当旋转手机时,当前视图被破坏,当应用程序到达对话框的.disclose()时,它崩溃了,因为它所连接的视图不再存在。在95%的案例中,我确实解决了这个问题,但是在剩下的5%中,仍然存在一个问题。我最初的解决方案是在htmlget运行时,通过将活动传递给AsyncTask并调用

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
在onPreExecute()中,并调用

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
在onPostExecute()中,这样即使用户旋转屏幕,也不会破坏当前活动。但是,正如我已经提到的,在剩下的5%中,仍然存在一个问题,导致强制关闭。我只知道以下几点:

我有这个StackTrace,我的用户通过Android Market提供给我:

java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:381)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:226)
at android.view.Window$LocalWindowManager.removeView(Window.java:432)
at android.app.Dialog.dismissDialog(Dialog.java:278)
at android.app.Dialog.access$000(Dialog.java:71)
at android.app.Dialog$1.run(Dialog.java:111)
at android.app.Dialog.dismiss(Dialog.java:268)
at com.vasga.telvira.AsyncHttpGetter.onPostExecute(AsyncHttpGetter.java:160)
at com.vasga.telvira.AsyncHttpGetter.onPostExecute(AsyncHttpGetter.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access$300(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3691)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
at dalvik.system.NativeStart.main(Native Method)
它发生在AsyncTask的下面一行(这是StackTrace中提到的第160行):

pd.isShowing()不能导致这种情况,因为我添加了if子句作为一种可能的解决方案,可能在某些罕见的情况下对话框没有显示出来,但它不起作用

我的应用程序与Android1.6.x兼容,但在eclipse中为Android2.2.x设置了编译级别,因为我启用了“移动到sd卡”功能

从用户发送的少量消息判断,他们启动htmlget,很可能看到ProgressDialog弹出,然后应用程序崩溃


你知道这是什么原因吗?或者如何解决?我的NOSENSOR方法正确吗?

似乎错误已经消失,至少我没有收到新版本中的任何新报告。我所做的是,我在主要活动中覆盖了这一点:

public Dialog onCreateDialog(int id)
然后,我将活动传递给任务,并在开始时设置nosensor thingie,然后当我显示对话框时,执行以下操作:

activity.showDialog(0);
activity.dismissDialog(0);
然后,当我不得不放弃它时,我做了这样一件事:

activity.showDialog(0);
activity.dismissDialog(0);

看起来是这样的。如果有任何语法错误,请原谅,我不在我的开发人员计算机上:)

这很棘手。每当你的应用程序暂停/恢复时,你都应该重新创建/隐藏进度对话框。当这个htmlget正在运行时,应用程序不会暂停,只是不应该,通常情况下最多需要5秒,所以我不知道为什么会发生这种情况。如果屏幕旋转,一旦旋转完成,你应该得到
onPause
。AsyncTask仍将运行。如果在恢复时动态重新创建对话框,应该没有问题。据我所知,在异步任务开始时,我确实禁用了旋转,并在任务结束时重新启用了旋转。根据我到目前为止所学到的,我将尝试传递ApplicationContext而不是Activity context,因此代替context ctx=this;我将使用Context ctx=getApplicationContext();,我们将看到它是如何工作的。尽管我尝试了一些解决方法,但它不会与applicationcontext一起工作。。如果这个错误看起来已经解决了,我会把它作为一个答案发布,直到那时,因为如果它不起作用,那就没有意义了