2017-03-07 5 views
0

Ich habe ein paar Domain-Objekte, Nachricht und Kontakt:Set Objektvariablen Innerhalb Service-Methode

public class Contact { 
    String name; 
} 

public class Message { 
    String body; 
    Contact contact; 
} 

Ich bin eine Liste von Message bevölkern und ihnen den Benutzer zeigt. Kontaktinformationen für jede der Nachrichten werden asynchron abgerufen, und dann wird die Liste aktualisiert. Dies ist im Grunde, wie ich sie aufrichten

listAdapter.setDataSet(listOfMessages); 

for (Message message : listOfMessages) { 
    fetchContactDetails(message); 
} 

... 

fetchContactDetails(Message message) { 
    contactService 
     .fetchContactDetails(listOfMessages) 
     .subscribeOn... // observe, etc 
     .observe(new Observable<Contact>() { 
      onNext(Contact contact) { 
       message.setContact(contact); 
       list.notifyChanged(message); 
      } 
     }); 

Das fühlt sich an wie eine Menge Code, da ich könnte stattdessen nur jede Funktion MessageContact innerhalb des Dienstes aktualisieren contactService.fetchContactDetails. Im Gegenteil, es fühlt sich unrein an, eine Dienstmethode zu verwenden, um das übergebene Objekt zu modifizieren, ohne etwas zurückzugeben.

Ist es eine schlechte Übung, eine Service-Funktion zu verwenden, um ein als Argument übergebenes Objekt zu aktualisieren, ohne etwas zurückzugeben?

+0

Die einzige Sache, die ich hinzufügen würde, ist, dass Sie notifyChanged einmal aufrufen sollten, nachdem alle Nachrichten Kontakte haben; Dies beschleunigt die Benutzeroberfläche, da sie nur einmal aktualisiert werden muss. –

+0

was ist das .obesrve()? und das neue Observable? Ich würde erwarten, zu abonnieren – yosriz

Antwort

0

Ist es eine schlechte Übung, eine Service-Funktion zu verwenden, um ein als Argument übergebenes Objekt zu aktualisieren, ohne etwas zurückzugeben?

Nein, können Sie void Methode Observable, unter Verwendung Completable, aber in Ihrem Fall implementieren Sie müssen noch die Benutzeroberfläche auf dem Haupt-Thread aktualisieren, so dass Sie abonnieren und die onNext auf Mainthread Griff (von observeOn(AndroidSchedulers.mainThread()) Hinzufügen).
Also in diesem Fall scheint Ihre Methode nicht rein void Methode, die nichts zurückgibt, aber Methode, die einige Daten aktualisiert und es an die Benutzeroberfläche zur Verarbeitung zurück.

Also, ich denke, es ist allgemeiner architektonische Frage, wie der Code richtig zu trennen. Ich würde trotzig die Modell-/Domänenlogik zusammen in separaten Observable sammeln und die UI/Präsentation die nur die UI-Updates behandeln lassen.

BTW, können Sie Schleife eleganter mit Rx mit from() und flatMap()

Observable.from(listOfMessages) 
    .flatMap(msg -> contactService.fetchContactDetails(msg)) 

dann können Sie die Kontrolle über die enitre Prozess haben, wie etwas zu tun, wenn alle Updates getan, oder die Parallelität oder was auch immer begrenzen.

Verwandte Themen