2010-08-24 9 views
6

Wir haben uns gefragt, ob bei der Verwendung von Bundle mit serialisierbaren oder parzellierbaren Objekten wann das Marshalling tatsächlich stattfindet? Sobald du es in das Bündel legst? Da Bündel meist dazu verwendet werden, Daten zwischen zwei Bildschirmen einfach weiterzugeben (wir reden hier nicht einmal über IPC!), Scheint es wenig Sinn zu haben, ein Objekt zu ordnen, da es die ganze Zeit im Speicher bleibt, nein ?Wird ein serialisierbares Objekt immer serialisiert, wenn es in einem Bündel abgelegt wird?

Sind wir recht in der Annahme, dass Rangier (sei es Java Serialisierung oder Android Parzellierung) geschieht nur, wenn

  1. die Daten an einen anderen Prozess übergeben werden müssen, beispielsweise während RMI, oder
  2. die Komponente (Aktivität oder Service) wird zerstört und Instanz-Zustand muss auf die Festplatte geschrieben werden?

Ich habe Android Framework Ingenieure gesehen (ich glaube, es Dianne Hackborn war) sagen, dass man Parcelable statt Serializable verwenden sollte, da erstere viel schneller ist. Wie viel schneller? Und wird das überhaupt einen Unterschied machen, wenn das Objekt sowieso eh nicht gemarshallt wird (vorausgesetzt, unsere Annahmen hierzu waren richtig)?

Antwort

6

Ich denke, ich habe es herausgefunden. Ich habe im Grunde den gesamten letzten Tag und die meisten heute auf Debugging über den Android Parcel und Bundle Quellcode, und hier ist, wie es funktioniert:

  • ein Bundle ist im Grunde nur ein Wrapper um ein HashMap, aber es unterstützt bis zu Paket (dh Marschall), dass interne Karte und sein Inhalt
  • , wenn Sie einen Wert in ein Bündel setzen, wird es zuerst unparcel diese interne Karte, und dann einfach den Wert in dieser Karte geschieht lazily
  • unparceling die Karte setzen: es wird es nur aufheben, wenn Sie versuchen, darauf zuzugreifen (zB durch Aufruf von bundle.putParcelable()). Selbst dann wird nur die Karte selbst entparkt, aber nicht ihre Werte. Nur wenn Sie versuchen, auf diese Werte zuzugreifen (z. B. mithilfe von bundle.getParcelable ("key")), wird auch der Wert aufgehoben. Mit anderen Worten, wenn Sie etwas paketieren, das sich in einem Bundle befindet, wird das Entfernen nicht aufgehoben, wenn Sie nie wieder auf diese Werte zugreifen.

So allgemein: NO, ein Wert ist einfach nicht parzelliert es in ein Bündel, indem. Stattdessen passiert das Parzellieren, wenn das Bundle an eine andere Komponente weitergegeben wird (Aktivität oder Dienst; warum Android das tut, weiß ich nicht, da keine IPC technisch stattfindet.) Oder wenn es sonst parzelliert werden muss.

+0

Haftungsausschluss: das ist ziemlich viel, was ich von der Fehlersuche in unserer App bekommen habe, für das, was es wert ist. Das Lesen des Quellcodes, der voller Variablen namens 'N' und' M' ist, ist nicht gerade erfreulich. Vielleicht habe ich etwas verpasst :-) – Matthias

+0

Disclaimer 2: Um Missverständnisse zu vermeiden, waren diese Variablen Teil des Bundle-Quellcodes unser eigenes :-D – Matthias

0

Ich denke, es passiert sofort. Und ich denke, dass die Leistungssteigerung wegen der serialisierbaren benötigten Reflektion funktioniert. Ich denke, es ist dasselbe wie der Leistungsunterschied zwischen serialisierbar und externalisierbar.

Verwandte Themen