Was löst diese Exception-Instanz aus: "java.lang.IllegalArgumentException: Der Beobachter ist null." und wie könnte es vermieden werden?

8

Ich bekomme diese Ausnahme, wenn ich nach dem Öffnen einer neuen Aktivität mit dem Inhalt des vom Benutzer ausgewählten Objekts zum ursprünglichen ListActivity zurückkehrt. Es kommt nur auf Ice Cream Sandwich vor.

Dies ist die Spur:

%Vor%

Keiner meiner Code ist im Stack erwähnt, so dass es mich wirklich rätselt und ich kann nicht einen schmutzigen Catch machen: /

Ich registriere anonymous DataSetObserver nur, wenn die Aktivität erstellt wird. Außerdem ist die Aktivität in eine ActivityGroup eingebettet (die in 4.0 veraltet ist, aber trotzdem unterstützt werden sollte, hatte ich gehofft).

Hat jemand dieses Problem mit dem neuen Betriebssystem gehabt?

Vielen Dank im Voraus.

Aktualisierung:

Ok, ich glaube, ich habe die Ursache des Problems gefunden, obwohl ich nicht sicher bin, wie ich es lösen soll.

Innerhalb von AbsListView.onDetachedFromWindow() Wir haben Folgendes:

%Vor%

Wenn der Beobachter nicht registriert ist, wird er ungültig gemacht. Das Problem kommt, dass es aus irgendeinem Grund in ICS zweimal aufgerufen wird. Ich denke, es ist ein bisschen albern, in einer delete-Operation nach Null-Parametern zu suchen, wie sie es in der Klasse Observable tun:

%Vor%

Warum ignorieren sie es nicht einfach ¬ ¬ Sie könnten das einfach machen und würden auch (oder besser) funktionieren:

%Vor%     
pablisco 14.12.2011, 16:48
quelle

2 Antworten

11

Dieses Problem wurde in Android 4.0.3 eingeführt und die Observable-Klasse wurde geändert, um eine Ausnahme auszulösen, wenn ein Beobachter mehr als einmal veröffentlicht wurde. Es wurde als Fehler gemeldet und kann hier gelesen werden: Ссылка .

>

Die einfachste Möglichkeit, dieses Problem zu umgehen, besteht darin, den zugrunde liegenden Adapter zu umbrechen und mehrere Versionen zu vermeiden.

%Vor%

Aber das wird nicht in allen Fällen funktionieren, z.B. ExpandableListView verfügt über einen internen Adapter, auf den nicht zugegriffen werden kann. Eine alternative Lösung besteht darin, die ExpandableListView zu umbrechen und die Ausnahme abzufangen. Diese Lösung hat für mich funktioniert, und ich habe noch keine Nebenwirkungen gefunden.

%Vor%     
Martin Kretz 07.02.2012, 09:34
quelle
3

Ich machte den dummen Fehler zu denken, dass keiner meiner Klassen in der Spur erwähnt wurde, aber LoadingDataView ist einer von ihnen. Es zeigt sich nicht in der ursprünglichen Spur, sondern in einer anderen, die verwandt war.

Innerhalb dieser Klasse gibt es einen anonymen ArrayAdapter, in dem sich der Vorfall ereignet hat, also habe ich das als Umgehung hinzugefügt:

%Vor%

Und es scheint jetzt zu funktionieren, obwohl ich mir immer noch nicht sicher bin, warum diese Methode zweimal aufgerufen wurde.

Obwohl ich für den Moment Fragmente verwenden werde, so viel ich kann;)

    
pablisco 15.12.2011 10:58
quelle