2009-08-06 7 views
1

サービスに複雑なオブジェクトを保持する必要があるため、確実にそのオブジェクトに戻ってきます(更新情報を保持しています)。当初、私はサービス実装で提出されたクラスと同じようにコード化しましたが、私は、更新オブジェクトがヌルに定期的にリセットされていることに気づいています。これはサーバークラス自体が再作成されたことを示しています。誰かがこのような更新オブジェクトを保存して再作成するための軽量で信頼できる戦略を推奨できますか?Androidサービスの永続フィールド

答えて

4

サービスを再開すると、onStop()onStart()メソッドが呼び出されます。 onStop()メソッドを使用して、永続的な場所にデータを保存することができます。アプリケーションsqliteデータベース。 onStart()が呼び出されると、データを復元できます。

sqliteデータベースは、アンドロイドデベロッパーwebsiteで読むことができます。

+0

問題はonStopとonStartではなく、実際にはこれらのメソッドを提供するためにAndroidがクラスの新しいインスタンスを作成する可能性があると思います。私は本当に高価な処理の別の費用になるので、実際にsqlite dbルートに行きたくない。私はより軽い代替のシリアル化/逆シリアル化を探しています – Bostone

+1

onStop()が呼び出された後、サービスインスタンスが強制終了されます。そういうわけで、このメソッドが呼び出されています:一方では、データをここに保存する必要があります。 データベースを使用しない場合は、Context.openFileOutput()を使用してファイルを保存できます。 Context.openFileInput()を使用して後で読むことができます(たとえば、onStart()が呼び出されたとき) – Scharrels

+0

このルートに従ってください:もし私のサービスクラスにStringがファイルされていれば、onStart /変数が必要になるたびにSharedPropertiesに読み書きするのではなく、クラスフィールドとして使用する – Bostone

3

私がやっていたら、私はSharedPreferencesを使います。それが複雑すぎる場合は、@ Scharrelsにsqlite DBを使用することに同意します(ほとんどのケースで、sqliteはsqliteを使用しているため、Googleの推奨事項となります)。

私はSharedPreferencesが多くの場合に便利であることを発見しました。まず、キーと値のペアリングストアで、さまざまなデータを簡単に保存できます。また、必要に応じてオブジェクトを文字列にエンコードし、単一のフィールドに格納することもできます。次に、複数のSharedPreferenceストアを、別の名前で検索するだけで(プライベートなままにして)使用することができます。最後に、データを取得してデータを格納することは、文字通りわずか2行のコード(必要なデータの数やシリアライゼーションを数えないため)を使用して簡単に使用できます。

+2

SharedPreferencesはXMLファイルに格納されているため、トランザクションでは保証されません。 – CommonsWare

+1

また、永続化する必要のあるオブジェクトの実際の複雑さに応じて、小さなSQLite DBよりも効率が悪くなる可能性があります。しかし、コード化すると、既存の何も解決策に比べて、永続性のために何かを得るのが非常に速くなります。プラスの面では、onDestroy()内の永続性は終了し、プロセスを終了する前に終了することができます。 – lilbyrdie

+0

マーク。私が固執しようとしているのは、HtmlClientのインスタンスとおそらくいくつかの派生オブジェクトです。これらはかなり複雑であり、直列化できない可能性があります。どうして?例えば、HttpClientはいくつかのクッキー数で初期化されます。私はいくつかのアプリケーションサーバー上で私のために作成されたセッションで、必要なクッキー数を確保しておく必要があります。私は何をしますか? – Bostone

関連する問題