Mutation eines Bundle-Objekts

8

Ich arbeite mit dem Legacy-Code und ich fand ein inkonsistentes Verhalten in dieser Funktion:

%Vor%

openFragment erhält nicht leere Bündelargumente, aber doOpenFragment erhalten ein leeres Bündel. Fragmente werden übergeben, indem commitAllowingStateLoss()

aufgerufen wird

Eine schnelle Lösung kann Bundle.clone () sein:

%Vor%

Es wird nicht alle Fälle behandeln und deepCopy ist nur in api26 verfügbar.

  1. Warum passiert das?
  2. Wie kann ich es reparieren?

[ UPDATE ]

Ich habe mit @ Pavel 's Lösung gespielt und die Dinge werden seltsamer

%Vor%

[UPDATE2]

Tatsächlich ist das Problem nicht mit postDelayed call. Lassen Sie uns den Call-Stack sehen:

in goRightToTheCollectionScreen das Bundle wird erstellt und gepackt (nichts Verdächtiges, keine Mutation danach).

Ich vermute, die Quelle des Problems in zwei Aufrufen innerhalb von openFragmentsChain :

%Vor%     
Maxim G 18.08.2017, 09:23
quelle

3 Antworten

3
  1. Ein anderer Code modifiziert das gleiche Bundle, bevor run () aufgerufen wird. Problem ist in Ihrem Code.
  2. Sie können die Serialisierung tiefklonen.

    %Vor%
Pavel 18.08.2017 13:51
quelle
2

Der Code, den Sie gepostet haben, scheint in Ordnung zu sein, daher wird Ihr Paket wahrscheinlich anderswo modifiziert (auch wenn Ihre postDelayed-Verzögerung 0 ist, wird das Runnable etwas später ausgeführt und Sie können das Paket in der Zwischenzeit modifizieren). Versuchen Sie, es direkt ohne postDelayed auszuführen, um zu sehen, ob das Problem weiterhin besteht. Sie können mehr von Ihrem Code posten, vielleicht können wir herausfinden, wo Sie sonst das Bündel berühren.

Wenn nichts anderes hilft, können Sie die Methode immer von API26 in Ihren Code kopieren und verwenden (Edge Case - das scheint ein einfaches Problem zu sein, also sollten Sie nicht müssen)

    
Nick 28.08.2017 13:20
quelle
0

Konnte Modellbündelarg nicht zu "leer" wechseln. Einfacher Code mit dem Fragment, das Handler-Beispiel mit dem angegebenen args-Wert aufruft. Wenn ich etwas falsch modelliere, geben Sie mir einen Hinweis

%Vor%     
Leontsev Anton 28.08.2017 21:37
quelle