1

私は他のウィンドウリークの投稿を読み、そこに何が役に立たないかを示唆したことを試しました。

A、B、Cの3つのアクティビティがあります。アクティビティAは、ユーザーから情報を収集します。アクティビティBは、別のスレッドのサーバーと通信している間、回転するProgressDialogを表示します。スレッドが終了すると、ProgressDialogを閉じて、次のアクティビティを開始します。アクティビティCは、サーバーからユーザーへの情報を表示します。アクティビティBは、ユーザーがCからヒットバックしたときにAにフォールバックするように設定されています。

これらのタスクが別々のアクティビティにあることが重要です。

現在のところ、次のシナリオを除いて、アプリはほとんどの場合正常に動作します。アクティビティAに戻る前にユーザーがアクティビティCで向きを変更すると、ウィンドウリークが原因でアプリがクラッシュします。

  • istart Cの前にアクティビティBのonPause()でProgressDialogを閉じています。
  • ハンドラーを使用してメインスレッドと別のスレッドでProgressDialogを閉じようとしました。
  • ユーザーがCで向きを変更しない場合、ウィンドウリークは発生しません。

何か案は?TIA

4

3 に答える 3

0

これが特定の問題に関連しているかどうかはわかりませんが、アクティビティの onCreate メソッドで作成されたダイアログの漏れやすいウィンドウに関係する同様の問題がありました。したがって、アクティビティがダイアログを表示し始め、設定を変更すると、OS はどのダイアログが表示されたかを記憶するため、アクティビティが強制終了されて再起動されると、OS は古いダイアログを復元しようとしますが、アクティビティは同じダイアログを表示しようとします。もう一度ダイアログを開きます (onCreate にあるため)。構成の変更 (つまり、savedInstanceState != null) でない場合にのみ、onCreate 中にダイアログを表示することで、ウィンドウのリークの問題が解消されました。

于 2011-09-28T18:38:35.497 に答える
0

これは、ProgressDialogs が使用されている場合によく発生します。しばらく前に ProgressDialog を試してみたところ、onPause() からそれを却下し、onResume() から新たに作成することが必要であることがわかりました。バックグラウンド タスクは明らかにアクティビティとダイアログを存続させる必要があるため、onRetainNonConfigurationInstance() を使用して、破棄されたアクティビティから新しいアクティビティにタスク インスタンスを渡しました。

別のより巧妙な回避策は、画面の向きが変わったという理由だけでアクティビティが破棄され、新しく作成されるのを防ぐことです。これを行うには、AndroidManifest.xml のタグに android:configChanges="orientation" を追加します。

于 2010-10-19T08:53:33.663 に答える
0

すべての処理方法を完全に変更することで、問題を解決しました。現在、アクティビティは 2 つ (A と B) しかなく、問題を回避するために、必要に応じて savedInstanceState を処理しながら、アクティビティ B に ProgessDialog を表示します。

アプリの問題を修正しましたが、以前に問題が発生した理由がまだわかりません。ウィンドウ リークと問題が発生した理由について詳しく知りたいと思います。私が抱えていた問題について誰かがもっと知っている場合は、同じ問題を抱えている人が他にもいると確信しているので、投稿してください。

ありがとう

于 2010-10-22T04:27:33.823 に答える