web-dev-qa-db-ja.com

Parcelableを使用してアイテムをsharedpreferencesとして保存しますか?

ArrayListに保存されているアプリに2つのオブジェクトLocationがあり、parcelableを使用してこれらをアクティビティ間で移動します。オブジェクトのコードは次のようになります。

public class Location implements Parcelable{

private double latitude, longitude;
private int sensors = 1;
private boolean day;
private int cloudiness;

/*
Måste ha samma ordning som writeToParcel för att kunna återskapa objektet.
 */
public Location(Parcel in){
    this.latitude = in.readDouble();
    this.longitude = in.readDouble();
    this.sensors = in.readInt();
}

public Location(double latitude, double longitude){
    super();
    this.latitude = latitude;
    this.longitude = longitude;
}

public void addSensors(){
    sensors++;
}


public void addSensors(int i){
    sensors = sensors + i;
}

+ Some getters and setters.

現在、これらのオブジェクトをより永続的に保存する必要があります。オブジェクトをシリアル化してsharedPreferencesとして保存できる場所を読みました。シリアライズ可能も実装する必要がありますか、それともパーセル可能で同様のことを実行できますか?

25
xsiand

From Parcelのドキュメント

Parcelは、汎用のシリアル化メカニズムではありません。このクラス(および任意のオブジェクトをパーセルに配置するための対応するParcelable API)は、高性能のIPC=トランスポートとして設計されています。そのため、パーセルデータを永続的に配置することは適切ではありません。ストレージ:パーセル内のデータの基盤となる実装を変更すると、古いデータが読み取れなくなる可能性があります。

30
StenSoft

Parcelableはデータを永続ストレージに配置するのに役立ちません(StenSoftの回答を参照)ため、代わりにgsonを使用して場所を永続化できます。

場所の保存:

val json = Gson().toJson(location)
sharedPreferences.edit().putString("location", json).apply()

場所の取得:

val json = sharedPreferences.getString("location", null)
return Gson().fromJson(json, Location::class.Java)

まだJavaを使用している場合は、valStringで置き換え、Gson()new Gson()で置き換え、::class.Java.classで置き換え、各行をセミカラムで終了します。

61
Cristan

推奨される方法は、おそらく IntentService を実装することです

0
LowFieldTheory