Mein Widget besteht aus 2 Schaltflächen und einem Listenansicht mit Daten. Wenn die Methode onUpdate des Widget-Anbieters aufgerufen wird, wird normalerweise alles normal geladen und alle sind glücklich.Die Android AppWidgetManager-Methode updateAppWidget kann keine Intents festlegen, Daten laden. Und es passiert zufällig
Allerdings habe ich manchmal bemerkt, nachdem die Update-Methode aufgerufen wird, kann das Widget nur vollständig seine Daten nicht laden. 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 Fehler-Stacks, die mir helfen, dies zu bestätigen.
Hier ist der Code, der in einem separaten Dienst wird von dem onUpdate Methode des AppWidgetProvider genannt:
@SuppressWarnings("deprecation")
private void updateWidget(int[] ids) {
AppWidgetManager widgetManager = AppWidgetManager.getInstance(this);
int[] widgetIds = widgetManager.getAppWidgetIds(new ComponentName(this, WidgetReceiver.class));
for (int currentWidgetId : widgetIds) {
RemoteViews widget = new RemoteViews(this.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(this, WidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, currentWidgetId);
intent.putExtra("random", randomNumber);
randomNumber++;
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
widget.setRemoteAdapter(currentWidgetId, android.R.id.list, intent);
Intent clickIntent = new Intent(this, DetailsActivity.class);
PendingIntent pending = PendingIntent.getActivity(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widget.setPendingIntentTemplate(android.R.id.list, pending);
Intent settingsIntent = new Intent(this, WidgetSettingsActivity.class);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent settingsPending = PendingIntent.getActivity(this, 0, settingsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widget.setOnClickPendingIntent(R.id.widget_settings, settingsPending);
Intent mainIntent = new Intent(this, MainActivity.class);
PendingIntent mainPending = PendingIntent.getActivity(this, 0, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widget.setOnClickPendingIntent(R.id.widget_logo, mainPending);
ComponentName widgetCompName = new ComponentName(this, WidgetReceiver.class);
widgetManager.updateAppWidget(widgetCompName, widget);
}
}
Was die meisten frustrierend ist über diesen Fehler ist, dass ich es nicht zuverlässig neu erstellen 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 genaue Problem in Facebooks Widget gesehen habe. Aufgrund NDA kann ich nicht einen Bildschirm meines app zeigen, wenn es fehlschlägt, aber ich einen Bildschirm von Facebook identischen Problem zeigen:
Wenn Facebook-Widget wie folgt aussieht, hat es genau die gleichen Probleme so wie meins. Keine Daten geladen, alle Schaltflächen reagieren nicht.
Sowohl für Facebook als auch für mein Widget wird das Problem normalerweise durch ein nachfolgendes Aktualisierungsintervall behoben.
So sehr ich weiß, dass ich nicht der Einzige bin, der hier reinkommt, ich möchte immer noch nicht veröffentlichen, 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ürs Helfen.
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.
Sicher genug, nach etwa 2 Stunden habe ich mein Handy überprüft und das Widget war tot, obwohl keine Update-Methode aufgerufen wurde. Das würde mich dazu bringen zu glauben, dass etwas anderes dieses Problem verursacht, NICHT widgetManager.updateAppWidget(widgetCompName, widget);
wie ich vorher dachte.
Ich weiß, dass eine Änderung der Konfiguration 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?
Ich bin mir nicht sicher, ob mein Problem ähnlich wie Ihres ist, aber Sie können sich diesen Stack ansehen, ich kann keine Lösung dafür finden http://stackoverflow.com/questions/15829738/update-issue-of-of- An-App-Widget-Verwendung-Sammlung – AndroidDev