Ich benutze RxJava
und Retrofit
, um eine App zu erstellen, und ich habe dieses Szenario, dass in meiner Ansicht eine Liste von Elementen vom Server geladen und dem Benutzer angezeigt wird. Der Benutzer kann die Daten aktualisieren, indem er auf eine Aktualisierungsschaltfläche klickt. Das Folgende ist eine grobe Implementierung meines Szenarios mit MVP.Wie manuell Ereignis von Observable anfordern?
// This is my retrofit adapter service
public interface ApiService{
@GET("items");
Observable<JsonElement> getItemsList();
}
// This is my presnter
public class MyPresnter{
...
public Observable<List<Item>> loadItemsList(){
return apiService.getItemsList().map(jsonElement -> {
// here I convert my api response to a List of Items
return new ArrayList<Item>();
});
}
}
// And inside my view I use RxBinding to bind my button click events
RxView.clicks(refreshBtn).subscribe(view -> mPresenter.loadItemsList()
.subscribeOn(Schdulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(list -> {/* update view */})
);
Nun meine Frage ist, wie soll ich Daten anfordern, ohne dass die refreshBtn
zum Beispiel klicken, wenn der Benutzer zuerst die Ansicht gelangt? Sollte ich refreshBtn.performOnClick()
verwenden?
Oder gibt es eine Möglichkeit, Ereignis auf einem bereits abonnierten Observable manuell anzufordern?
Ich verstehe, warum Sie RxJava hier verwenden möchten (ich war auch besessen davon, es überall zu benutzen, nachdem ich etwas darüber gelernt habe), aber Ihr Anwendungsfall braucht wahrscheinlich überhaupt keine reaktive Vorgehensweise. Machen Sie es einfach so, wie Sie es bei AsyncTask tun würden: Erklären Sie eine "Subskriptions" -Eigenschaft auf Ihrem Bildschirm, weisen Sie sie beim Abonnieren dem Ergebnis von "Observable # subscribe" zu und löschen Sie sie, wenn die Hintergrundoperation abgeschlossen ist. Beachten Sie, dass RxJava-Klassen viel Overhead haben, also Methoden wie 'RxView.clicks' zu verwenden, wie Sie es tun (ohne sie tatsächlich mit anderen Operatoren zu verketten), ist eine ziemlich schlechte Idee. – user1643723