106

イベント検索アプリケーションを作成しています。ある画面から検索条件を設定し、別の画面に入力すると、ユーザーは3番目の画面から検索条件を編集して4番目の画面に移動できます。

上記のタスクを実行するために、アプリケーション周辺の値を記憶する静的オブジェクトを使用しており、特別なことをする必要はありません。

しかし、低メモリがアンドロイドを見つけた場合、アンドロイドの静的オブジェクトのライフサイクルについては、静的オブジェクトを削除するのではないかと心配しています???

androidはマルチタスクをサポートしているため、ユーザーが別のアプリケーションに切り替えて、ユーザーが戻ってきたときにアプリケーションが狂ったように動作し始めた場合、マルチタスク時に静的オブジェクトが削除されますか?何か案が ??また、シングルトンメソッドを介して静的オブジェクトを保持する方が良いアプローチであることをお勧めします???

4

4 に答える 4

244

少し背景から始めましょう: アプリケーションを起動するとどうなりますか?
OS はプロセスを開始し、一意のプロセス ID を割り当て、プロセス テーブルを割り当てます。プロセスは DVM (Dalvik VM) のインスタンスを開始します。各アプリケーションは DVM 内で実行されます。
DVM は、クラスのロード、アンロード、インスタンスのライフサイクル、GC などを管理します。

静的変数の有効期間: 静的変数は、クラスが JVM によってロードされると存在し、クラスがアンロードされると消滅します。

そのため、Android アプリケーションを作成して静的変数を初期化すると、次のいずれかが発生するまで JVM に残り
ます。1. クラスがアンロードさ
れる 2. JVM がシャットダウンする
3. プロセスが 終了する

別のアプリケーションの別のアクティビティに切り替えても、静的変数の値は保持され、上記の 3 つのいずれも発生しないことに注意してください。上記の 3 つのいずれかが発生した場合、スタティックはその値を失います。

これは、数行のコードでテストできます。

  1. アクティビティのonCreateで初期化されていない静的を出力します-> nullを出力する必要があります
  2. 静的を初期化します。印刷する -> 値はnullではない
  3. 戻るボタンを押して、ホーム画面に移動します。注: ホーム画面は別のアクティビティです。
  4. アクティビティを再度起動します -> 静的変数は null 以外になります
  5. アプリケーション プロセスを DDMS から強制終了します (デバイス ウィンドウの停止ボタン)。
  6. アクティビティを再開します -> static は null 値になります。

それが役立つことを願っています。

于 2009-12-22T06:46:47.390 に答える
17

さて、Singleton パターンも静的変数の使用に基づいているため、実際には同じ立場になります。ほとんどの場合、静的アプローチは機能しますが、場合によっては、メモリがいっぱいになり、アプリケーションが次の画面に移動する前に別のアクティビティがフォアグラウンドになると、アクティビティのプロセスが強制終了され、静的値が失われることがあります。ただし、Android では、状態間で値を保持したり、値を送信したりするためのいくつかのオプションが用意されています。

  • インテントを使用すると、検索条件をアクティビティからアクティビティに渡すことができます (Web http リクエストと同様)。
  • アプリケーション設定を使用して、値を保存し、それらを必要とするアクティビティでそれらを取得できます
  • sqlite データベースを使用すると、それらをテーブルに保持し、後で取得できます
  • アクティビティの状態を保存するだけで、再起動時に以前に選択した値がフィールドに入力されるようにする必要がある場合は、 onSaveInstanceState() アクティビティ メソッドを実装できます。これは、アクティビティ間の状態の永続化には推奨されないことに注意してください。

Google コードまたは他のオープン ソース Android アプリケーションのaegis-shield ソース コード ツリーを見ると、プリファレンス、インテント、および sqlite データベースの使用法のコード例を取得できます。

于 2009-12-22T10:24:06.930 に答える
6

いくつかの調査の結果、アプリケーションを使用してシングルトンを保存することは、再作成する準備ができていない限り、それほど優れたアイデアではないことがわかりました。

アプリケーション オブジェクトにデータを保存しない

したがって、受け入れられた回答は技術的には正しいですが、すべての情報を提供するわけではありません。

上記のリンクが示唆するように、そのモデルに本当に固執したい場合は、可能であれば、NULLを確認してデータを再現する準備ができている必要があります。

于 2016-12-07T14:22:33.357 に答える