1

私の問題はこれに似ています:

AsyncTaskでProgressDialogを閉じる際のエラー

onPreExecuteに次のようなダイアログを作成するAsyncTaskがあります。

dialog = ProgressDialog.show(activity, "login", "logging in, one moment please");

そして、次のようにonPostExecuteのダイアログを閉じます。

if (dialog != null && dialog.isShowing()) {
    dialog.dismiss();
}

それでも、次のメッセージを含むdiolog.dismiss()を実行する行のユーザーからエラーレポートが表示されます:java.lang.IllegalArgumentException:ビューがウィンドウマネージャーに接続されていません

最も一般的な根本原因は、ユーザーが向きを切り替えたとき(縦向きから横向き、またはその逆)です。ただし、私のアプリはポートレートモードに強制されているため、これが原因になることはありません。(私はこれを再確認して、それが本当に不可能であることを確認しました)

前述の投稿のレポーターは、アクティビティクラスでAsyncTaskの内部クラスを作成し、アクティビティクラスからonCreateDialogを操作し、AsyncTaskからshowDialogを呼び出すことで、最終的に解決しました(そして私は他の場所でもこの解決策を読みました)。(これを理解していない場合は彼の投稿を読んでください)私はそれを実装しようとし始めましたが、showDialogが無効になっているようです:これは私にとっての解決策ではありません。

私が見つけた最後の解決策は、単に例外をキャッチすることです。私もそれを自分で考えていましたが、それは最後の手段にすぎませんでした。私は、単に例外をキャッチして何が起こっているのかわからないのではなく、実際に何がうまくいかないのかを理解し、それを予測することを好みます。

4

2 に答える 2

1

これをmanifest.xmlに追加する必要があります

APIレベル12まで

   <activity
        android:label="@string/app_name"
        android:name=".Activity_calling_AsyncTask"
        android:configChanges="keyboardHidden|orientation">

aplレベル12の後

   <activity
        android:label="@string/app_name"
        android:name=".Activity_calling_AsyncTask"
        android:configChanges="keyboardHidden|orientation|screensize">
  </activity>

これがお役に立てば幸いです。

于 2012-09-21T16:08:12.060 に答える
0

チャドが言っていることが正しければ(一部のデバイスは数分の1秒間横向きで起動する可能性があります)、これがエラーレポートを取得する最も可能性の高い原因だと思います。Rajendraの解決策はそれを防ぐことができるかもしれませんが、画面の回転だけが本当の問題の原因ではないので、他の人が指摘しているように、バンドエイドを適用するような気分になると私は判断しました。

さらに検索した後、私は2つの解決策を見つけました:

  1. ここで説明するApplicationクラスから継承するクラスの一部としてAsyncTaskを実装する:AsyncTasksが実行されているときに画面の向きの変更を処理する
  2. onRetainNonConfigurationInstance()/ setRetainInstance()を実装します。最初の例をここに示します:http ://twigstechtips.blogspot.com/2011/11/for-my-app-moustachify-everything-i-was.html-ただし、メソッド自体は非推奨であるため、同様の方法でsetRetainInstanceを使用することをお勧めします。

完全を期すために、この問題を解決できると主張するDroid-FuforAndroidライブラリもあります。

于 2012-09-24T07:59:02.737 に答える