3

私のアプリの特定のアクティビティを開始すると、ユーザーは続行するためにいくつかのデータを入力する必要があるダイアログで「歓迎」されます。次に、アクティビティ自体で、ユーザーは2つのボタンを使用して、無限の数のフィールド(複数のビューで構成される)を動的に作成および削除できます。

ご存知のように、画面の向きが変わると、アクティビティが再開されるため、すべての情報が失われます。明らかに、これは問題になる可能性があります。

画面の向きを処理するために、Androidのドキュメントでは開発者にonRetainNonConfigurationInstance()を使用するようにアドバイスしています。唯一の問題は、これを使用してコンテキスト内のオブジェクトを保存すると、関連付けられているすべてのビューがリークすることです。私の場合、これはさらに問題があります。なぜなら、そのアクティビティのデータは本質的にそのビューに関連付けられており、ビューはそのコンテキストに関連付けられているからです。

Androidのドキュメントでは、開発者が構成の変更を自分で処理することを推奨していません。彼らは、「一般的に、後で彼らの生活を複雑にするだけの短期的な解決策」と述べています(そして私は引用します)

たとえば、hasBeenShownブール値を作成してtrueに設定するなど、最初のダイアログを簡単にバイパスできます。メタデータを保存することで、「動的に作成されたビュー」の問題を回避することもできます。この場合、生成されたフィールドの数、タイプ、相互の相対位置、テキストまたは選択などです。バグがありますが、深刻なことは何もありません)。

ただし、フィールド(ビュー)はlayoutInflateを使用して動的に生成されるため(したがって、ビューの数は無限になります)、画面の向きを変更した後に同じフィールドを再生成すると、エミュレーターでもアプリケーションが非常に遅くなります。実際のデバイス(Samsung Galaxy S)に20フィールド(約120ビュー)がある場合、完了するまでに約1分かかりました。

不思議なことに、ビューを直接渡したとき(つまり、すべてのものがリークしたとき)、SamsumgGalaxySが完了するまでに10秒もかかりませんでした。

この情報から、あなたはそれが最善のアプローチだと思いますか?

(1)-フィールドをリセットしますか?(実際にはオプションではありません。誤って画面を傾けると、誰もが腹を立てるでしょう= P)

(2)-Androidが画面の向きの変更を処理している間にロード画面を追加しますか?

(3)-ブロック画面の向きの変更

(4)-画面の向きの変更を自分で処理し、DoomAndroidのドキュメントで話題になっているものが決して来ないことを願っています。

PS:少しオフトピックですが、私のアクティビティが終了すると、すべてのメモリが解放されますか?

4

1 に答える 1

6

あなたの状況は私の状況とは異なりますが、同様の解決策が適切である可能性があります。

繰り返しますが、Android は方向の変更時に破棄して再作成するため、最初はネットワーク通信を行う非同期タスクに問題がありました。明らかに、最初の要求がまだ実行されているときに、方向の変更ごとに新しい要求を作成するべきではありません。

ネットワークの使用と頭痛の種を節約するために、向きの変更を自分で「処理」するだけです。このコードを AndroidManifest.xml に配置することにより

<activity android:name=".whatever" android:configChanges="keyboardHidden|orientation"/>

ビューや変数などを使用して、Android が現在のコンテキストを保持できるようにします。何が起こるかというと、レイアウト自体のサイズが変更されますが、正しく設計されていれば問題ありません。

私の知る限り、私が Android を妨げている唯一のことは、デバイスの向きに基づいて特殊なレイアウトを使用することです (これは必要ありません)。

于 2010-11-30T04:19:54.700 に答える