1

シナリオは次のとおりです。

  • アカウントログインページ
  • 「サインイン」をクリックすると、ログインAsyncTaskがトリガーされます
  • ネットワークアクセス中にUIをブロックするために、ProgressDialogがポップアップします
  • 戻ると、ProgressDialogは閉じられ、ユーザーは

このフローは非常にうまく機能します。

ここに問題があります:

  • ユーザーは、AsyncTaskがログインしているときに画面を回転させることができます

現在、ProgressDialogはクラスフィールドによって参照されており、そのポインタを使用して却下され、.dismiss()が呼び出されます。

ただし、画面を回転させると、すべてがクラッシュします。

おそらくアクティビティが再作成されたためですか?私の疑いは、そのフィールド参照の周りのクロージャが到達不能なオブジェクトを指しているということです。あなたの考えは何ですか?

どうすれば確実かつエレガントに解決できますか?if (... != null)チェックを追加するだけですか?

より一般的には、次のような場合に適用する「ベストプラクティス」を理解していないことを告白する必要があります。

  • アクティビティAがAsyncTaskをトリガーします
  • ユーザーがアクティビティAから移動します([戻る]ボタン?画面を回転する?onClickでインテントが開始されますか?)
  • AsyncTaskは、アクティビティAが最上位ではなく、そのonPostExecute()にUI効果がある場合に返されます。注:元のデリゲートオブザーバーは使用できなくなります。

  • 混乱している*(注:私は初心者なので、徹底的な説明が大いに役立ちます)

4

2 に答える 2

1

はい、向きを変更すると、アクティビティは破棄され、再度作成されます。
実行時に構成の変更が発生すると、デフォルトでアクティビティがシャットダウンされて再起動されますが、この属性を使用して構成を宣言すると、アクティビティが再起動されなくなります。代わりに、アクティビティは実行されたままになり、そのonConfigurationChanged()メソッドが呼び出されます。 この行をマニフェストファイルに
追加しますandroid:configChanges="orientation|keyboardHidden"

<activity
    android:name=""
    android:label="" 
    android:configChanges="orientation|keyboardHidden" />
于 2012-12-19T00:55:34.067 に答える
0

ランタイム変更の処理を参照することをお勧めします。利用可能なメソッドの詳細の詳細な説明については。

android:configChanges="orientation..." tells android your application will take care of resizing the current view hierarchy.  As such, when you specify that in your manifest, your activity will not be destroyed and recreated, instead the system will just call your activity's `onConfigurationChanged()` method.  As it so happens, most of the stock widgets will resize themselves when their container changes, so if you are using basic layouts, this usually "just works" by redrawing the view hierarchy in the new format.  For custom widgets, this trick may not work.  

承認された方法は、メソッドで破棄されたときにいくつかの構成インスタンス情報を保存してからonSaveInstanceState()、で状態を再作成することです。onCreate()

あなたの場合、画面の向きが変わるとダイアログが閉じられるので、そのままにするか、で再度開くことができますonCreate()

于 2012-12-19T01:24:39.383 に答える