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として保存できる場所を読みました。シリアライズ可能も実装する必要がありますか、それともパーセル可能で同様のことを実行できますか?
From Parcelのドキュメント :
Parcelは、汎用のシリアル化メカニズムではありません。このクラス(および任意のオブジェクトをパーセルに配置するための対応するParcelable API)は、高性能のIPC=トランスポートとして設計されています。そのため、パーセルデータを永続的に配置することは適切ではありません。ストレージ:パーセル内のデータの基盤となる実装を変更すると、古いデータが読み取れなくなる可能性があります。
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を使用している場合は、val
をString
で置き換え、Gson()
をnew Gson()
で置き換え、::class.Java
を.class
で置き換え、各行をセミカラムで終了します。
推奨される方法は、おそらく IntentService を実装することです