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.
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 :
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
MainActivity.java
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
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); } }
A priori c'est cette ligne :
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; } }Qui me pose problème...
Code : Sélectionner tout - Visualiser dans une fenêtre à part listItems = (ArrayList<HashMap<String, Object>>) savedInstanceState.getSerializable(listArticles);
Auriez-vous une idée ? cher amis :-)
Partager