我有一个完全独立的类,它扩展了 AsyncTask,我用它来执行 html get,所以它不会冻结 UI。在 AsyncTask 的构造函数中,我传递了活动的上下文,该上下文调用了任务的 .execute(),因此我可以在 htmlget 运行时显示 ProgressDialog。第一个问题出现了:旋转手机时,当前视图被破坏,当应用程序到达对话框的 .dismiss() 时,它崩溃了,因为它附加到的视图不再存在。我确实设法在 95% 的情况下解决了这个问题,但是在剩下的 5% 中,仍然存在问题。我最初的解决方案是在 htmlget 运行时强制禁用旋转,方法是将活动也传递给 AsyncTask,并调用
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
在 onPreExecute() 中,并调用
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 行):
if(pd.isShowing()) pd.dismiss(); //dismiss the pd after we are done, if it is visible(it should be)
pd.isShowing() 不会导致这种情况,因为我添加了 if 子句作为可能的解决方案,也许对话框在极少数情况下没有显示,但它没有解决
我的应用程序与 android 1.6.x 兼容,但在 eclipse 中为 android 2.2.x 设置了编译级别,因为我启用了“移动到 sd 卡”功能
从少数用户发送消息来看,他们启动htmlget,他们很可能看到ProgressDialog弹出,然后应用程序崩溃
知道什么会导致这种情况吗?或者如何解决?我的 NOSENSOR 方法是否正确?