2017-08-21 2 views
0

Von Server (API REST), kann ich eine Liste von Artikel (Produkte) mit einigen Informationen von jedem erhalten. Ich ordne diese Liste in einem RecyclerView mit einem Adapter ab. Ich zeige eine Ladeansicht, bis ich diese Liste erhalte.Laden von Daten aus dem Netzwerk pro Artikel in RecyclerView

Allerdings muss ich mehr Informationen pro Artikel in jeder Zeile anzeigen, aber ich kann diese Informationen nur mit einer anderen HTTP-Anfrage (pro Artikel) erhalten, die ID dieses Produkts sendend. Daher möchte ich die Benutzeroberfläche jeder Zeile mit dieser Information asynchron füllen (wenn die Zeile angezeigt wird).

Wie ist der bessere Weg das zu erreichen? Ich denke, das ist das gleiche Problem wie das asynchrone Laden von Bildern, also sollte ich etwas wie Bibliotheken wie Picasso oder Universal Image Loading machen. Ist es nicht?

Kennen Sie irgendeine Bibliothek, um mir dabei zu helfen?

Vielen Dank im Voraus!

+0

Sie könnten einen AsyncTaskLoader für jeden RecyclerView-Eintrag verwenden, der gestartet wird, wenn die Zeile angezeigt wird. –

+0

Ja! Wie auch immer, ich sollte die Wiederverwendung von Ansichten mit de ViewHolder verwalten: Wenn der Dienst reagiert, wird die Ansicht möglicherweise wiederverwendet und einem anderen Element zugeordnet. – LopezAgrela

+0

Wenn Sie eine statische Ansicht haben, ist es einfach wiederzuverwenden. Wenn Sie eine "On Click Visible" Ansicht haben, muss diese auf jeden Fall gerendert werden. Wenn Sie diese Operation oft tun, sollten Sie vielleicht über eine Holding-Datenstruktur nachdenken, die am Anfang mit Null gefüllt ist (also würde ein Klick eine Asynctask ausgeben) und wenn Sie das entsprechende Element bereits heruntergeladen haben, wird es gefüllt (ein Klick würde ein Laden auslösen) vom Objekt). Oder wenn es nicht zu groß ist (keine Bilder oder Videos) lade die zusätzlichen Informationen komplett herunter, es klingt wie Overhead, aber manchmal macht es Dinge einfacher und effizienter als vorher. –

Antwort

1

Sie können dies erreichen, indem Sie die RxJava-Bibliothek verwenden. Zum Beispiel in Ihrer onBindViewHolder Methode würden Sie vielleicht so etwas tun:

Observable.fromCallable { 
    loadDataAsync(position, <other arguments you need>) 
}.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe { loadedData -> 
    holder.setAdditionalData(loadedData) 
} 

Natürlich müssen Sie den Überblick über jedes Abonnement halten und abmelden nachdem das Einzelteil, um recycelt wurde Speicherlecks zu verhindern.

Wie auch immer, Sie sollten wahrscheinlich Ihr API-Design überarbeiten und den Server dazu bringen, alle Daten in einem Anfrage-/Antwort-Zyklus zu senden, statt jede Menge kleiner HTTP-Anfragen für jedes Element zu erstellen. In diesem Fall verschwindet Ihr Problem einfach.

+0

Danke! Vielleicht ist es in Ordnung. Aber ich denke, es braucht viel mehr Verwaltung, wie die Anzahl der aktiven Netzwerkverbindungen steuern (mit einem ThreadPoolExecutor), oder prüfen, ob die Daten eines Artikels bereits angefordert (und zwischengespeichert) wurden. Daher ist es zwingend erforderlich, einen Manager zu erstellen. und vielleicht bietet RxJava keine Hilfe. – LopezAgrela

Verwandte Themen