Ich habe eine durchsuchbare Aktivität erstellt. Jetzt möchte ich Suchvorschläge hinzufügen, die aus dem Webdienst stammen. Ich möchte diese Vorschläge asynchron erhalten. Laut Hinzufügen von benutzerdefinierten Vorschlägen muss ich die Abfragemethode überschreiben, mache meinen Vorschlag Suche, erstelle meinen eigenen MatrixCursor und gib ihn zurück. aber das ist das Problem, meine Anfrage, den Vorschlag zu bekommen, ist asynchron. Wenn das Ergebnis also zurück ist, wird es vom Geltungsbereich der Abfragemethode ausgeschlossen.
Es scheint, dass die Anfrage an den Suggestions-Content-Provider laut dieser Antwort nicht auf dem UI-Thread ausgeführt wird: Ссылка . Wenn Sie Ihre HTTP-Anfrage ändern können, können Sie sie einfach als Blocking innerhalb der Abfrage-Methode bezeichnen. Könnte helfen, auf Unterbrechungen oder andere Signale zu hören (benutzerdefinierte vielleicht), um unnötige Anfragen zu stoppen.
Eine weitere Option - wenn Sie keine Anfrageklassen ändern möchten, die bereits asynchron sind (wie bei Verwendung von Robospice) - sollten Sie einfach die MatrixCursor-Referenz zurückgeben und sie später auffüllen. Die AbstractCursor-Klasse implementiert bereits das Observer-Muster und sendet Benachrichtigungen im Falle von Änderungen. Wenn das Suchsystem zuhört, sollte es mit Änderungen in den Daten umgehen. Ich muss das noch selbst implementieren, also kann ich nicht bestätigen, dass es genauso gut funktionieren wird, wie ich es mir vorstelle. (Werfen Sie einen Blick auf die Quelle von CursorLoader für mehr Inspiration.)
Und ist das nicht der ganze Sinn eines Cursors? Andernfalls könnten wir einfach eine Liste mit Daten zurückgeben.
UPDATE: Für mich hat die Verwendung eines MatrixCursors nicht funktioniert. Stattdessen habe ich zwei andere Lösungen implementiert:
Filter#performFiltering()
(die ich mit dem synchronen Aufruf an den Remote-Service überschreibe) wird asynchron aufgerufen und der UI-Thread ist nicht blockiert. Verwenden des SearchWidget mit einer SearchableActivity und einem benutzerdefinierten ArrayAdapter (ohne benutzerdefinierten Filter). Wenn die Suchabsicht eintrifft, wird die Remote-Anfrage gestartet (Robospice) und wenn sie über Callback zurückkommt, rufe ich die folgende benutzerdefinierte Methode für meine ArrayAdapter<Tag>
-Unterklasse auf:
Diese Methode sorgt dafür, dass die Benachrichtigungen auf dem Adapter und damit in der Suchergebnisliste ausgelöst werden.
Das nächste, was ich gefunden habe, um dies zu lösen, ist die Verwendung eines ContentProviders und die Durchführung der Netzwerkanfrage auf der Methode Query
Ihres Providers (selbst wenn dies gegen die Best Practices verstößt), mit dem Ergebnis, dass Sie ein MatrixCursor
, wie es angezeigt wird hier und hier .
Ich bin immer noch auf der Suche nach anderen Optionen wie der Verwendung von SyncAdapter
, was überwältigend erscheint, um nur Vorschläge zu zeigen, die sonst nirgends verwendet werden.
Eine weitere Option, die ich asynchron dafür verwendet habe, ist die Verwendung einer AutoCompleteTextView. Auf diese Weise können Sie einen benutzerdefinierten Adapter erstellen, in dem Sie die Funktion getFilter
so implementieren können, wie sie in diese Antwort .
Tags und Links android search search-suggestion