IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Sauvegarde Activité et Restauration.


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut Sauvegarde Activité et Restauration.
    Bonjour,

    J'aimerais pouvoir fermer mon activité et de l'a relancer sans perdre des données.
    Pour cela je tente d'utiliser l'interface Parselable. Et de persister mes données au format Json, puis de les désérialisations hors j'ai cette erreur apparemment lors de ma désérialisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    06-23 12:22:57.487 2875-2875/com.sdz.app W/System: ClassLoader referenced unknown path: /data/app/com.sdz.app-1/lib/x86
    06-23 12:22:57.657 2875-2881/com.sdz.app W/art: Suspending all threads took: 18.958ms
    06-23 12:22:57.866 2875-2875/com.sdz.app W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
    06-23 12:22:57.967 2875-2875/com.sdz.app I/System.out: Format Json : [{"Nombre":2,"Titre":"Tomates"},{"Nombre":1,"Titre":"Fromage"}]
    06-23 12:22:57.973 2875-2875/com.sdz.app D/AndroidRuntime: Shutting down VM
     
     
                                                               --------- beginning of crash
    06-23 12:22:57.973 2875-2875/com.sdz.app E/AndroidRuntime: FATAL EXCEPTION: main
                                                               Process: com.sdz.app, PID: 2875
                                                               java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sdz.app/com.sdz.app.MainActivity}: com.google.gson.JsonParseException: The JsonDeserializer MapTypeAdapter failed to deserialize json object [{"Nombre":2,"Titre":"Tomates"},{"Nombre":1,"Titre":"Fromage"}] given the type java.util.HashMap<java.lang.String, java.lang.Object>
                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                   at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                   at android.os.Looper.loop(Looper.java:148)
                                                                   at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                Caused by: com.google.gson.JsonParseException: The JsonDeserializer MapTypeAdapter failed to deserialize json object [{"Nombre":2,"Titre":"Tomates"},{"Nombre":1,"Titre":"Fromage"}] given the type java.util.HashMap<java.lang.String, java.lang.Object>
                                                                   at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:64)
                                                                   at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:92)
                                                                   at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:80)
                                                                   at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:101)
                                                                   at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:67)
                                                                   at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:52)
                                                                   at com.google.gson.Gson.fromJson(Gson.java:551)
                                                                   at com.google.gson.Gson.fromJson(Gson.java:498)
                                                                   at com.google.gson.Gson.fromJson(Gson.java:467)
                                                                   at com.google.gson.Gson.fromJson(Gson.java:417)
                                                                   at com.sdz.app.MainActivity.onCreate(MainActivity.java:37)
                                                                   at android.app.Activity.performCreate(Activity.java:6237)
                                                                   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)*
                                                                   at android.app.ActivityThread.-wrap11(ActivityThread.java)*
                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)*
                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)*
                                                                   at android.os.Looper.loop(Looper.java:148)*
                                                                   at android.app.ActivityThread.main(ActivityThread.java:5417)*
                                                                   at java.lang.reflect.Method.invoke(Native Method)*
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)*
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)*
                                                                Caused by: java.lang.IllegalStateException: This is not a JSON Object.
                                                                   at com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:83)
                                                                   at com.google.gson.MapTypeAdapter.deserialize(MapTypeAdapter.java:66)
                                                                   at com.google.gson.MapTypeAdapter.deserialize(MapTypeAdapter.java:33)
                                                                   at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:51)
                                                                   at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:92)*
                                                                   at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:80)*
                                                                   at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:101)*
                                                                   at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:67)*
                                                                   at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:52)*
                                                                   at com.google.gson.Gson.fromJson(Gson.java:551)*
                                                                   at com.google.gson.Gson.fromJson(Gson.java:498)*
                                                                   at com.google.gson.Gson.fromJson(Gson.java:467)*
                                                                   at com.google.gson.Gson.fromJson(Gson.java:417)*
                                                                   at com.sdz.app.MainActivity.onCreate(MainActivity.java:37)*
                                                                   at android.app.Activity.performCreate(Activity.java:6237)*
                                                                   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)*
                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)*
                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)*
                                                                   at android.app.ActivityThread.-wrap11(ActivityThread.java)*
                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)*
                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)*
                                                                   at android.os.Looper.loop(Looper.java:148)*
                                                                   at android.app.ActivityThread.main(ActivityThread.java:5417)*
                                                                   at java.lang.reflect.Method.invoke(Native Method)*
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)*
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)*
    06-23 12:27:58.281 2875-2875/com.sdz.app I/Process: Sending signal. PID: 2875 SIG: 9
    Comme vous pouvez le voir je remplis juste une List<HashMap<String, Object>> , que j'essai de sérialiser et désérialiser. Voici le code de ma Class :

    MainActivity.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    package com.sdz.app;
     
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.os.Parcelable;
    import android.os.PersistableBundle;
    import android.preference.PreferenceManager;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
     
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    public class MainActivity extends AppCompatActivity {
     
        ListView listWiewPerso;
        static final String listArticles = "listArticles";
        HashMap<String, Object> map;
        ArrayList<HashMap<String, Object>>listItems = new ArrayList<HashMap<String,Object>>();
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            Gson gson = new Gson();
            //Chargement de la list sauvegarder à l'exécution précédente
            String json = sharedPreferences.getString("listItems", null);
            System.out.println("Format Json : "+json);
            if(json != null){
                listItems = gson.fromJson(json, new TypeToken<HashMap<String, Object>>(){}.getType());
            }
     
            if(savedInstanceState != null){
              listItems = (ArrayList<HashMap<String, Object>>) savedInstanceState.getSerializable(listArticles);
            }
     
            listWiewPerso = (ListView) findViewById(R.id.listViewPerso);
            listItems.add((HashMap<String, Object>) ajouterArticle(2,"Tomates"));
            listItems.add((HashMap<String, Object>) ajouterArticle(1,"Fromage"));
     
            //Sauvegarde de la liste de courses.
            if(!listItems.isEmpty()) {
                sharedPreferences.edit().putString("listItems", gson.toJson(listItems)).apply();
            }
            SimpleAdapter simple = new SimpleAdapter(this.getBaseContext(), listItems, R.layout.affichageitem,
                 new String[] {"Nombre", "Titre"}, new int[] {R.id.Nombre, R.id.Titre});
            listWiewPerso.setAdapter(simple);
        }
     
        /**
         * Méthode d'ajout d'un article dans la Hashmap à ajouter à l'item list.
         * @param nombre
         * @param titre
         * @return
         */
        public Map ajouterArticle(Integer nombre, String titre){
            Articles article = new Articles(nombre, titre);
            map = new HashMap<String, Object>();
            map.put("Titre", (String)article.getTitre());
            map.put("Nombre", (Integer)article.getNombre());
            return map;
        }
     
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putSerializable("listArticles", listItems);
     
        }
     
    }
    Et ma Class Pojo Articles.java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    package com.sdz.app;
     
    import android.os.Parcel;
    import android.os.Parcelable;
     
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.HashMap;
     
    public class Articles implements Serializable,Parcelable {
     
        public static Creator<Articles> getCREATOR() {
            return CREATOR;
        }
     
        private Integer nombre;
        private String titre;
        ArrayList<HashMap<String,Integer>> listItems = new ArrayList<HashMap<String,Integer>>();
     
        public Articles(Integer nombre, String titre){
            this.nombre = nombre;
            this.titre = titre;
        }
     
        protected Articles(Parcel in) {
            nombre = in.readInt();
            titre = in.readString();
        }
     
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(nombre);
            dest.writeString(titre);
        }
     
        @Override
        public int describeContents() {
            return 0;
        }
     
        public static final Creator<Articles> CREATOR = new Creator<Articles>() {
            @Override
            public Articles createFromParcel(Parcel in) {
                return new Articles(in);
            }
     
            @Override
            public Articles[] newArray(int size) {
                return new Articles[size];
            }
        };
     
        public Integer getNombre() {
            return nombre;
        }
     
        public void setNombre(Integer nombre) {
            this.nombre = nombre;
        }
     
        public String getTitre() {
            return titre;
        }
     
        public void setTitre(String titre) {
            this.titre = titre;
        }
     
        public ArrayList<HashMap<String, Integer>> getListItems() {
            return listItems;
        }
     
        public void setListItems(ArrayList<HashMap<String, Integer>> listItems) {
            this.listItems = listItems;
        }
     
    }
    A priori c'est cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      listItems = (ArrayList<HashMap<String, Object>>) savedInstanceState.getSerializable(listArticles);
    Qui me pose problème...

    Auriez-vous une idée ? cher amis :-)

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut
    Apparemment c'est lorsque je cherche à désérialiser que cela plante. Pourtant le format Json affiché dans la console me paraît correct ... non ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut
    Je vois que je n'ai pas beaucoup d'adeptes pour me venir en aide, c'est que j'ai dû mal m'exprimer :

    En fait ce que je cherche c'est juste à récupérer le contenu d'une list<Hashmap<String, Object>> après fermeture et ouverture de l'activité.

    En gros à sérialiser l'objet, j'ai vue que ce n'était pas conseillé d'utiliser l'interface serializable comme en JAVA standard car celle-ci prenait pas mal de ressource.

    Quelqu'un pourrait m'indiquer la meilleur solution. Et m'expliquer un peu les étapes car j'ai vue qu'on pouvait utiliser les préférences et donc d'où mon problème cité plus haut...

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Si je suis mon intuition, je dirai que tu as un problème au niveau des valeurs numériques.
    Je pense qu'elles sont désérialisées en tant que "int", ce qui pose un problème puisque le type "int" ne peut pas être stocké dans une Map (c'est le type Integer qu'il faut utiliser).
    Pour palier à ça, tu peux transtyper tes valeurs en String, ce qui devrait te permettre de tout désérialiser sans problème.

    De plus, ton JSON :
    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [
       {
          "Nombre":2,
          "Titre":"Tomates"
       },
       {
          "Nombre":1,
          "Titre":"Fromage"
       }
    ]
    N'est pas une Map<String, Object>. C'est un tableau (les [] englobants) contenant des pairs.

    Tu ferais mieux de te créer une classe POJO du genre :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public class Foodstuff {
     
        @SerializedName("Nombre")
        private int mQuantity;
     
        @SerializedName("Titre")
        private String mName;
     
        public int getQuantity() {
            return mQuantity;
        }
     
        public void setQuantity(int quantity) {
            mQuantity = quantity;
        }
     
        public String getName() {
            return mName;
        }
     
        public void setName(String name) {
            mName = name;
        }
    }

    Et t'en faire une List<Foodstuff> pour la désérialization je pense.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sauvegarde et la restauration
    Par Ghilas1985 dans le forum Bases de données
    Réponses: 8
    Dernier message: 16/11/2009, 18h57
  2. Réponses: 0
    Dernier message: 27/05/2009, 00h51
  3. Réponses: 0
    Dernier message: 25/05/2009, 18h14
  4. sauvegarde 9i pour restauration 10g
    Par Oraman dans le forum Oracle
    Réponses: 5
    Dernier message: 18/08/2006, 10h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo