web-dev-qa-db-fra.com

Utiliser parcelable pour stocker l'article en tant que préférences partagées?

J'ai quelques objets, Location, dans mon application stockés dans une ArrayList et j'utilise parcelable pour les déplacer entre les activités. Le code de l'objet ressemble à ceci:

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.

Maintenant, j'ai besoin de stocker ces objets de façon plus permanente. J'ai lu quelque part que je peux sérialiser les objets et les enregistrer en tant que SharedPreferences. Dois-je également implémenter sérialisable ou puis-je faire quelque chose de similaire avec parcelable?

25
xsiand

De documentation du colis :

Le colis n'est pas un mécanisme de sérialisation à usage général. Cette classe (et l'API Parcelable correspondante pour placer des objets arbitraires dans une parcelle) est conçue comme un transport haute performance IPC. En tant que tel, il n'est pas approprié de placer des données de parcelle dans des données persistantes stockage: les modifications de l'implémentation sous-jacente de l'une des données du colis peuvent rendre les données plus anciennes illisibles.

30
StenSoft

Étant donné que parcelable n'aide pas à placer vos données dans un stockage persistant (voir la réponse de StenSoft), vous pouvez utiliser gson pour conserver votre emplacement à la place:

Enregistrement d'un emplacement:

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

Récupération d'un emplacement:

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

Si vous utilisez toujours Java, remplacez val par String, Gson() avec new Gson(), ::class.Java Par .class Et terminez chaque ligne par un point-virgule.

61
Cristan

La manière préférée serait d'implémenter un IntentService probablement

0
LowFieldTheory