2011-11-05 12 views
7

static class variablesで悪い経験をしました。クラスがアンロードされると値が失われたからです。したがって、私はそれらをすべて避けます。すべての変数を復元する必要がありますか?

今、私は "普通の"変数でさえ(おそらくあまりにも)心配しています。

通話、メモリ不足などの状況によって値が失われる可能性があるかどうかはわかりません。

変数には100%の値を保持できますか?または

すべてのアクティビティ変数に対して有効な復元を保証しますか?

ありがとうございました!

答えて

19

クラスがアンロードされるときに値が失われるので、私は静的クラス変数の使用経験がありませんでした。

クラスは「アンロード」しません。 Your process will be terminated Androidがメモリを解放する必要があるときに、フォアグラウンドに何も持っていないことがあります。

変数に依存して値を100%にすることはできますか?またはすべての活動変数に対して何らかの種類の有効なリストアを保証しますか?

アクティビティは、onPause()を呼び出してフォアグラウンドから移動したときに通知されます。そのアクティビティの観点からは、onPause()の後にいつでも(おそらく)対応するonResume()まで、プロセスが終了してアクティビティが失われる可能性があります。

あなたは座ってデータモデルについて考える必要があります。ユーザーがあなたのアプリを離れると(たとえばHOMEを押す)、1時間、1日、または1ヶ月間あなたのアプリに戻ることはないとします。ユーザーが合理的に予想していた時間内にそのデータを保存することが必要なデータは、永続データストア(データベースやフラットファイルなど)に保存する必要があります。データがいつ保存されるかは、ユーザーが[保存]ボタンを押したとき、またはアクティビティのonPause()にあるか、それとも別のときにあるかを判断する作業です。

画面の現在の内容に関連付けられているが、1か月間保存する必要がないデータは、経由で保持することができます。画面の回転を処理するためにこれを既に使用していることを望みます。そうであれば、ユーザーがあなたの活動を離れるが、BACKボタンを使って戻ることができるような方法で(例えば、電話がかかってきたら、テキストメッセージが来て、テキストメッセージを表示してWebブラウザを起動し、その間に終了していたアプリに戻って)、保存されたインスタンスの状態が復元されます。

他のすべて - アクティビティのインスタンスデータメンバー、または静的データメンバーなど - Androidがあなたのプロセスを終了することを選択した場合、ユーザーがアプリを離れると失われる可能性があります。したがって、静的データメンバーは、通常、短期間のキャッシュや、ユーザーがHOMEを押して電話をかけるなどして失われても問題にならないものに対してのみ使用されます。

+0

私のアプリはNullPointerExpectionで2つの静的なクラス変数を比較しながらクラッシュしました:Ax == Bx 100%は値をアプリケーション自体からnullに設定できないので、私はこの質問をして、アンロード "して静的変数をnullにします。そこでクラスAをグローバル定数を保持するシングルトンとして実装しました。クラスBの値はすべてDBに保存されます。ポイントは、私はすべての私の重要な値をデータベースから復元する必要がありますonResume?あなたが説明したことの詳細をどこで読むことができますか?すべてを十分に理解しているかどうかわからないからです。ありがとう! – user387184

+0

psには、これらの「特別な」ケースをテストする方法がありますか?クリティカル変数をDBに保存する前に、アプリの中断が何かの途中で起きた場合はどうなりますか?またはonPauseは常に呼び出されるので、onPauseに値を保存することができますか?そうでなければ誰が知っていますか?一方の部分が保存されていてもう一方の部分がこの中断の原因ではない場合、DBは簡単に破損する可能性があります。再度、感謝します! – user387184

+0

@ user387184: "重要なのは、すべての重要な値をonResumeのDBから復元する必要がありますか?" - 私はどのように知っていますか?それはあなたのアプリであり、私のものではありません。 「あなたが説明したことの詳細をどこで読むことができますか?すべてを十分に理解しているかどうかわからないからです。 - 私は答えの中でプロセスライフサイクルドキュメントにリンクしました。アクティビティライフサイクルのドキュメントは次のとおりです:http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle "またはonPauseは常に呼び出されるので、onPauseに値を保存することができますか?" - onPause()は、ユーザーのバッテリーが飛び出すのを防ぐために呼び出されます。 – CommonsWare

0

普通の変数は残っていますが、あなたがonResumingしているときと、onCreatingしているときに決して確信が持てないという問題があります(Androidがちょうど行くときのコントロールがないので、 ..現在使用されていないものは破壊の対象となります)。

だから、誰かが論理的にデバイスをスリープ状態にしたり、回転させたり、電話をかけたりする場所の間に本当に必要な場合は、どんな方法でも物を保存することをお勧めします。それはTOP(ness)を中断します。

バンドルの仕方が気に入らないので、私はJSONオブジェクトに格納しています。文字列に変換して、ただ一つのフラットSharedPreference Stringとして保存します。あなたのアプリケーションがGCされたら、あなたのバンドルは他のものと一緒に投げられるでしょう)。こうすることで、10億種類のバンドル要素を使って周りを回るのではなく、いつでも自分が望むときにそれをつかむことができますが、それは明らかに趣味の問題です。ちょっとした作業がありますが、シリアル化/逆シリアル化ではオーバーヘッドが少し増えますが、まれなインスタンスで変数が破壊されているだけなので、心配する必要はありません(膨大な量とにかくデータベースを使用する必要があります)。

関連する問題