0

我有一个完全独立的类,它扩展了 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 方法是否正确?

4

1 回答 1

0

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

public Dialog onCreateDialog(int id)

然后,我将活动传递给任务,并在开始时设置 nosensor ,然后当我显示对话框时,这样做:

activity.showDialog(0);

然后,当我不得不解雇它时,我这样做了:

activity.dismissDialog(0);

似乎它是这样工作的。如果有任何语法错误,请原谅我,我不在我的开发人员计算机上:)

于 2012-03-14T10:35:18.090 回答