0

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のアプローチは正しいですか?

4

1 に答える 1

0

エラーはなくなったようです。少なくとも、新しいバージョンで新しいレポートを受け取っていません。私がしたことは、メインアクティビティでこれをオーバーライドしたことです。

public Dialog onCreateDialog(int id)

次に、アクティビティをタスクに渡し、最初にnosensorthingieを設定し、ダイアログを表示したときに次のようにしました。

activity.showDialog(0);

それから、私がそれを却下しなければならなかったとき、私はこれをしました:

activity.dismissDialog(0);

このように機能しているようです。構文エラーがある場合はご容赦ください。開発者のコ​​ンピューターではありません:)

于 2012-03-14T10:35:18.090 に答える