Die Android AppWidgetManager-Methode updateAppWidget kann keine Intents festlegen, Daten laden. Und es passiert zufällig

8

Mein Widget besteht aus zwei Schaltflächen und einer Listenansicht mit Daten. Wenn die Methode onUpdate des Widget-Anbieters aufgerufen wird, wird normalerweise alles normal geladen und alle sind glücklich.

Allerdings habe ich manchmal bemerkt, dass nach dem Aufruf der Update-Methode das Widget seine Daten nicht vollständig laden kann. Die Listenansicht ist leer und alle Schaltflächen reagieren nicht. Es ist, als ob ich das Layout in das Widget initialisiert hätte, aber keine der ausstehenden Absichten oder der Adapter für die Liste wurden gesetzt.

Ich habe alles protokolliert und festgestellt, dass dies nicht der Fall ist. Die ausstehenden Absichten werden jedes Mal erstellt, ebenso wie der Listenadapter, einschließlich der zufälligen Zeit, zu der es fehlschlägt. Lange dachte ich, es hätte damit zu tun, wie die Listendaten in den Adapter eingetragen werden, aber da es jedes Mal funktioniert, gepaart mit der Tatsache, dass die Schaltflächenabsichten nicht so gut funktionieren, führt mich die Methode updateAppWidget dazu (ComponentName, RemoteViews) ist was fehlschlägt. Es gibt jedoch keine Fehlerstacks, die mir helfen, dies zu bestätigen.

Hier ist der Code, der in einem separaten Dienst ausgeführt wird, der von der OnUpdate-Methode des AppWidgetProvider aufgerufen wird:

%Vor%

Am frustrierendsten an diesem Bug ist, dass ich ihn nicht zuverlässig wiederherstellen kann. Manchmal bekomme ich (un) Glück und es zeigt es hässlichen Kopf, andere Zeiten (die meiste Zeit) funktioniert es perfekt.

Eine andere Sache, die ich für interessant hielt, ist, dass ich das gleiche Problem in Facebooks Widget gesehen habe. Aufgrund der NDA kann ich keinen Bildschirm meiner App zeigen, wenn es fehlschlägt, aber ich kann einen Bildschirm von Facebook's identischen Problem zeigen:

Wenn das Widget von Facebook so aussieht, hat es die gleichen Probleme wie meine. Keine Daten geladen, alle Tasten reagieren nicht.

Bei Facebook und meinem Widget wird das Problem normalerweise durch ein nachfolgendes Aktualisierungsintervall behoben.

So sehr ich es schätze, dass ich nicht der Einzige bin, der darauf reinkommt, ich möchte immer noch nicht loslassen, bis ich das Problem gelöst habe. Ist hier jemand darauf gestoßen und hat noch besser eine Lösung oder gar eine Ursache des Problems gefunden? Danke für Ihre Hilfe.

EDIT: Etwas Interessantes. Ich habe ein Experiment durchgeführt, bei dem ich das Aktualisierungsintervall auf einen ganzen Tag und nicht alle 30 Minuten eingestellt habe. Meine Hypothese war, dass die Update-Methode vielleicht nicht die Ursache war, sondern dass etwas anderes dazu führte, dass das Widget leer und nicht mehr reagierte.

Nach ungefähr zwei Stunden habe ich mein Handy überprüft und das Widget war tot, obwohl keine Update-Methode aufgerufen wurde. Das würde mich glauben machen, dass etwas anderes dieses Problem verursacht, NOT widgetManager.updateAppWidget(widgetCompName, widget); , wie ich vorher gedacht habe.

Ich weiß, dass eine Konfigurationsänderung dazu führen kann, dass das Widget neu erstellt wird und daher möglicherweise fehlschlagen kann. Allerdings verwende ich bereits die onConfigurationChanged-Methode der Service-Klasse, um das Widget bei Bedarf neu zu laden. Gibt es einen weiteren Fall wie Konfigurationsänderungen, die dazu führen können, dass sich das Widget selbst zerstört und neu erstellt?

    
JMRboosties 13.11.2012, 19:30
quelle

1 Antwort

5

Nach viel Blut, Schweiß und Tränen fand ich die Lösung. Ich werde diese Antwort ein paar Tage lang nicht bestätigen, um sicher zu gehen, dass der Fehler nicht wieder auftaucht, aber nach einer Menge von Beobachtungen glaube ich, dass es gelöst ist.

Ich hatte also Recht in meinen bearbeiteten Kommentaren in der ursprünglichen Frage. Es war nicht die Update-Methode des AppWidgetManagers, die das Problem verursachte, sondern ein anderer Android-Prozess, der dazu führte, dass das App-Widget sich selbst neu erstellte. Leider konnte ich diesen Auslöser nicht isolieren, aber ich fand eine Lösung.

In meiner RemoteViewsFactory-Klasse (im Grunde der Wrapper, der zum Laden des Datensatzes verwendet wird) hatte ich einen Code-Block, der folgendermaßen aussah:

%Vor%

Wenn die Liste leer war, zeigte ich im Grunde eine Lade-Nachricht, die den gesamten Bereich aufnahm, in dem sich die Listenansicht befand. Wenn die Liste nicht leer wäre, würde ich diese Nachricht einfach ausblenden.

Das ist also passiert: Als die Fabrik zerstört wurde (vermutlich zu Gedächtniszwecken), war das Widget selbst nicht. Also wurde der gesamte Code, der die Absichten für die Daten und das Zeug festlegt, nicht ausgeführt. Die Factory wurde jedoch neu erstellt. Dort wurde der Codecode ausgeführt, der das App-Widget mit dem neuen Remote Views-Objekt aktualisiert hat. Dieses Remote-Sichten-Objekt hat keine der Methoden ausgeführt, die Sie in meiner onUpdate () -Methode sehen, die ich ursprünglich gepostet habe, so dass alle seine Funktionen nicht funktionierten.

Moral der Geschichte: Verwenden Sie nicht updateAppWidget in Ihrer RemoteViewsFactory-Klasse! Jetzt kann es funktionieren, wenn Sie alle notwendigen Zeilen ausführen, aber ich kann das nicht bestätigen.

    
JMRboosties 16.11.2012, 00:33
quelle

Tags und Links