シナリオは次のとおりです。
- アカウントログインページ
- 「サインイン」をクリックすると、ログインAsyncTaskがトリガーされます
- ネットワークアクセス中にUIをブロックするために、ProgressDialogがポップアップします
- 戻ると、ProgressDialogは閉じられ、ユーザーは
このフローは非常にうまく機能します。
ここに問題があります:
- ユーザーは、AsyncTaskがログインしているときに画面を回転させることができます
現在、ProgressDialogはクラスフィールドによって参照されており、そのポインタを使用して却下され、.dismiss()が呼び出されます。
ただし、画面を回転させると、すべてがクラッシュします。
おそらくアクティビティが再作成されたためですか?私の疑いは、そのフィールド参照の周りのクロージャが到達不能なオブジェクトを指しているということです。あなたの考えは何ですか?
どうすれば確実かつエレガントに解決できますか?if (... != null)
チェックを追加するだけですか?
より一般的には、次のような場合に適用する「ベストプラクティス」を理解していないことを告白する必要があります。
- アクティビティAがAsyncTaskをトリガーします
- ユーザーがアクティビティAから移動します([戻る]ボタン?画面を回転する?onClickでインテントが開始されますか?)
AsyncTaskは、アクティビティAが最上位ではなく、そのonPostExecute()にUI効果がある場合に返されます。注:元のデリゲートオブザーバーは使用できなくなります。
混乱している*(注:私は初心者なので、徹底的な説明が大いに役立ちます)