AsyncTaskを拡張する完全に別個のクラスがあります。これをhtmlgetの実行に使用するため、UIがフリーズしません。AsyncTask Imのコンストラクターで、タスクの.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マーケットから提供してくれたものです。
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句を追加したので、まれにダイアログが表示されなかった可能性がありますが、うまくいきませんでした
私のアプリケーションはandroid1.6.xと互換性がありますが、「sdカードに移動」機能が有効になっているため、Eclipseでandroid2.2.xにコンパイルレベルが設定されています。
少数のユーザーが送信したメッセージから判断すると、ユーザーはhtmlgetを開始し、ProgressDialogがポップアップするのを確認した後、アプリケーションがクラッシュする可能性があります。
何がこれを引き起こす可能性があるのか考えていますか?またはそれを解決する方法は?NOSENSORのアプローチは正しいですか?