2016-08-01 1 views
0

Mon application est un adaptateur RSS qui fonctionne avec SQlite, viewpagers et RecyclerViews. Tout fonctionne bien, mais une fois que je laisse mon application en appuyant sur le bouton d'accueil, plantage de mon application et montre la logcat suivante:Non sérialisable SQLiteCursor quand je rentre à la maison

FATAL EXCEPTION: main 
                         Process: com.herprogramacin.hermosaprogramacion, PID: 14900 
                         java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.herprogramacin.hermosaprogramacion.UI.Adapters.RVAdapter) 
                          at android.os.Parcel.writeSerializable(Parcel.java:1468) 
                          at android.os.Parcel.writeValue(Parcel.java:1416) 
                          at android.os.Parcel.writeArrayMapInternal(Parcel.java:686) 
                          at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330) 
                          at android.os.Bundle.writeToParcel(Bundle.java:1079) 
                          at android.os.Parcel.writeBundle(Parcel.java:711) 
                          at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:137) 
                          at android.os.Parcel.writeTypedArray(Parcel.java:1254) 
                          at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:384) 
                          at android.os.Parcel.writeParcelable(Parcel.java:1437) 
                          at android.os.Parcel.writeValue(Parcel.java:1343) 
                          at android.os.Parcel.writeArrayMapInternal(Parcel.java:686) 
                          at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330) 
                          at android.os.Bundle.writeToParcel(Bundle.java:1079) 
                          at android.os.Parcel.writeBundle(Parcel.java:711) 
                          at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3701) 
                          at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4622) 
                          at android.os.Handler.handleCallback(Handler.java:739) 
                          at android.os.Handler.dispatchMessage(Handler.java:95) 
                          at android.os.Looper.loop(Looper.java:158) 
                          at android.app.ActivityThread.main(ActivityThread.java:7224) 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                         Caused by: java.io.NotSerializableException: android.database.sqlite.SQLiteCursor 
                          at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344) 
                          at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 
                          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 
                          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 
                          at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959) 
                          at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360) 
                          at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054) 
                          at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384) 
                          at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 
                          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 
                          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 
                          at android.os.Parcel.writeSerializable(Parcel.java:1463) 
                          at android.os.Parcel.writeValue(Parcel.java:1416)  
                          at android.os.Parcel.writeArrayMapInternal(Parcel.java:686)  
                          at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330)  
                          at android.os.Bundle.writeToParcel(Bundle.java:1079)  
                          at android.os.Parcel.writeBundle(Parcel.java:711)  
                          at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:137)  
                          at android.os.Parcel.writeTypedArray(Parcel.java:1254)  
                          at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:384)  
                          at android.os.Parcel.writeParcelable(Parcel.java:1437)  
                          at android.os.Parcel.writeValue(Parcel.java:1343)  
                          at android.os.Parcel.writeArrayMapInternal(Parcel.java:686)  
                          at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330)  
                          at android.os.Bundle.writeToParcel(Bundle.java:1079)  
                          at android.os.Parcel.writeBundle(Parcel.java:711)  
                          at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3701)  
                          at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4622)  
                          at android.os.Handler.handleCallback(Handler.java:739)  
                          at android.os.Handler.dispatchMessage(Handler.java:95)  
                          at android.os.Looper.loop(Looper.java:158)  
                          at android.app.ActivityThread.main(ActivityThread.java:7224)  
                          at java.lang.reflect.Method.invoke(Native Method)  
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  

Où on peut lire "Caused by: java.io.NotSerializableException:android.database.sqlite.SQLiteCursor"

Pourquoi est-il ce passe?

EDIT 1:

Comment mes application fonctionne. L'activité principale obtient le code XML pour RSS et une fois qu'il a terminé, MainActivity obtient le curseur et génère l'adaptateur de vue Recycler.

  • L'activité principale crée le viewpager et lui envoie l'adaptateur RecyclerView.

  • ViewPager crée un nouveau fragment et passe l'adaptateur au nouveau fragment

  • Le nouveau fragment génère la vue et fixe l'adaptateur avec les données ViewPager lui envoya. J'ai réalisé qu'il était fou de générer l'adaptateur dans MainActivity et de le passer au fragment via 3 classes. Pourrait être ce le problème?

  • Répondre

    1

    Il semble que vous déteniez une référence à un SQLiteCursor dans une activité ou une autre logique de vue. Lorsque Android tente de mettre en pause votre activité, il tente de sérialiser les données que l'activité a actuellement (et les objets dépendants) afin qu'elles puissent être désérialisées lorsque l'activité reprend. Regardez autour de vous pour savoir comment vous utilisez SQLiteCursor, vous ne devriez pas les transmettre à votre activité ou à tout objet modèle utilisé par votre activité.

    +0

    Je pense que vous avez raison. S'il vous plaît lire mon edit et dites-moi. – mhkore

    +0

    Oui, c'est le problème des sons de celui-ci. Au lieu d'avoir une référence au SQLiteCursor, je suggère plutôt de créer une classe dont le seul travail est de lire les données de la base de données et de les encapsuler dans un objet modèle. Si vous n'êtes pas familier avec cela, vous pouvez rechercher un modèle d'objet d'accès aux données. Il simplifiera votre code à long terme et vous donnera une bonne séparation entre vos données et la couche de vue. –