2010-11-15 23 views
6

Je dois envoyer des données à un Activity, qui peut s'exécuter dans un contexte différent. Pour cela j'ai créé une classe disons A, qui a un ArrayList de type de données disons que B est son membre d'instance. J'ai déclaré que la classe B était la classe interne de classe A. Pour envoyer l'instance de cette classe A via Intent, j'ai créé les classes A et B à la fois Parcelable. StructureParcage imbriqué: RuntimeException - code de type inconnu Unmarshalling 3211319 au décalage 440

de classe est quelque chose comme ceci (cela ne comprend pas le code complet par exemple écrit pour faire les classes Parcelable):

public class A implements Parcelable{ 

    public class B implements Parcelable{ 
     public ArrayList<String> value; 
     .... 
     .... 
      public void writeToParcel(Parcel dest, int flags) { 
      dest.writeList(value); 
      } 
     .... 
     .... 
    } 

    public List<B> group; 
    public String name; 

    .... 
    .... 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeList(group); 
     dest.writeString(name); 
     } 
    .... 
    .... 
} 

J'utilise la fonction putExtra (String name, Parcelable value) pour mettre les données.

Mais du côté de la réception, je me suis l'exception suivante:

Uncaught handler: thread main exiting due to uncaught exception 
E/AndroidRuntime(1087): 1289817569622 java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.SET_VOIP_SUPP_SERVICE_REQUEST_LOCAL (has extras) } in [email protected] 
E/AndroidRuntime(1087):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:765) 
E/AndroidRuntime(1087):  at android.os.Handler.handleCallback(Handler.java:587) 
E/AndroidRuntime(1087):  at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(1087):  at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(1087):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
E/AndroidRuntime(1087):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(1087):  at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime(1087):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
E/AndroidRuntime(1087):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
E/AndroidRuntime(1087):  at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(1087): Caused by: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 3211319 at offset 440 
E/AndroidRuntime(1087):  at android.os.Parcel.readValue(Parcel.java:1777) 
E/AndroidRuntime(1087):  at android.os.Parcel.readListInternal(Parcel.java:1956) 
E/AndroidRuntime(1087):  at android.os.Parcel.readList(Parcel.java:1302) 
E/AndroidRuntime(1087):  at com.hsc.example.android.MyApp.A.<init>(A.java:61) 
E/AndroidRuntime(1087):  at com.hsc.example.android.MyApp.A.<init>(A.java:57) 
E/AndroidRuntime(1087):  at com.hsc.example.android.MyApp.A$1.createFromParcel(A.java:67) 
E/AndroidRuntime(1087):  at com.hsc.example.android.MyApp.A$1.createFromParcel(A.java:1) 
E/AndroidRuntime(1087):  at android.os.Parcel.readParcelable(Parcel.java:1845) 
E/AndroidRuntime(1087):  at android.os.Parcel.readValue(Parcel.java:1713) 
E/AndroidRuntime(1087):  at android.os.Parcel.readMapInternal(Parcel.java:1947) 
E/AndroidRuntime(1087):  at android.os.Bundle.unparcel(Bundle.java:169) 
E/AndroidRuntime(1087):  at android.os.Bundle.getParcelable(Bundle.java:1037) 
E/AndroidRuntime(1087):  at android.content.Intent.getParcelableExtra(Intent.java:3269) 
E/AndroidRuntime(1087):  at com.hsc.example.android.MyApp.MyAppActuvity$1.onReceive(MyAppActuvity.java:219) 
E/AndroidRuntime(1087):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:754) 
E/AndroidRuntime(1087):  ... 9 more 

Puis je me suis déplacé la classe B, en dehors de la classe A (Comme je pensais que cela peut être un problème de classe interne, et a déclaré la CRÉATEUR static Cette déclaration statique n'était pas présente lorsque la classe B était une classe interne de classe A). Mais cela n'a pas aidé.

Il semble que ce problème soit dû à un paquetage imbriqué.

Une suggestion?

NOTE: quand je fonction de classe Bundle, puis unmarshalled à l'aide android.os.Bundle.getParcelable(String key) alors tout va bien. Il semble donc que le problème concerne uniquement les intentions.

+1

Avez-vous trouvé une solution à jamais cette question? Je semble devoir faire face à un scénario similaire. – Ita

Répondre

1

Avez-vous inclus le CREATOR dans les deux?

public static final Parcelable.Creator<A> CREATOR = new Parcelable.Creator<A>() { 
    public A createFromParcel(Parcel in) { 
     return new A(in); 
     } 

    public A[] newArray(int size) { 
     return new A[size]; 
     } 
}; 

& constructeurs qui prennent une parcelle:

public A(Parcel parcel) { 
    name = parcel.readString(); 
    //etc.. 
} 

?

+0

Est-ce que "EventFilter" est une erreur copier + coller? – Mehmed

+0

Oui, je l'ai corrigé dans la réponse, merci – FunkTheMonk

0
  1. changement List<B>-ArrayList<B>
  2. Utilisez writeTypedList et readTypedList lire et à écrire ArrayList