2010-11-15 5 views
6

Ich muss einige Daten an eine Activity senden, die in anderem Kontext ausgeführt werden kann. Dafür habe ich eine Klasse say A erstellt, die eine ArrayList des Datentyps sagt B als eines der Instanz Mitglied hat. Ich habe die Klasse B als Klasse der Klasse A erklärt. Um diese Instanz der Klasse A durch Intent zu senden, machte ich Klasse A und B beide Parcelable.Verschachtelte Parzellierung: RuntimeException - Unmarshalling unbekannter Typencode 3211319 bei Offset 440

Klassenstruktur ist so etwas wie diese (nicht das vollständige Code zum Beispiel Code enthält geschrieben, um die Klassen Parcelable zu machen):

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); 
     } 
    .... 
    .... 
} 

Ich benutzen die putExtra (String name, Parcelable value) Funktionsdaten zu setzen.

Aber auf der Empfangsseite, bekam ich die folgende Ausnahme:

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 

Dann zog ich die Klasse B, außerhalb der Klasse A (Wie ich dachte, das Problem der inneren Klasse sein kann, und erklärte die CREATOR Diese statische Deklaration war nicht vorhanden, wenn Klasse B eine innere Klasse der Klasse A war). Aber es hat nicht geholfen.

Dies scheint, dass dieses Problem auf geschachteltes Parceling zurückzuführen ist.

Irgendwelche Vorschläge ??

HINWEIS: wenn ich Funktion der Bundle-Klasse verwendet, und entordnet es dann mit android.os.Bundle.getParcelable(String key) dann fein alles ist. Es scheint also, dass das Problem nur in Bezug auf Intents besteht.

+1

Haben Sie jemals eine Lösung für dieses Problem finden? Ich muss mich anscheinend mit einem ähnlichen Szenario auseinandersetzen. – Ita

Antwort

1

Haben Sie den CREATOR für beide hinzugefügt?

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]; 
     } 
}; 

& Konstruktoren, die ein Paket nehmen:

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

?

+0

Ist das "EventFilter" ein Kopieren + Einfügen Fehler? – Mehmed

+0

Ja, ich habe es in der Antwort korrigiert, danke – FunkTheMonk

0
  1. ändern List<B>-ArrayList<B>
  2. Verwendung writeTypedList und readTypedList zu schreiben und lesen Arraylist
Verwandte Themen