Das letzte Mal habe ich im folgenden Artikel über das Erstellen einer Beispiel-App gesprochen. RxJava (RxAndroid) + RxBus + Datenbindung + Raumbeispiel (basierend auf Java 1.7) auf Android.
Dieses Mal werde ich die Implementierung erläutern, die RxJava verwendet, um Daten asynchron von der API zu erfassen. Informationen zur Betriebsumgebung finden Sie im vorherigen Artikel oben.
Beim Versuch, Daten von einer im Web vorhandenen API abzurufen Die Verarbeitung kann je nach Kommunikationsstatus und Datenmenge einige Zeit dauern. Während dieser Zeit verschlechtert sich die Benutzeroberfläche, wenn Operationen auf dem Bildschirm (Stornierung usw.) nicht akzeptiert werden Die zeitaufwändige Verarbeitung erfolgt in der Regel asynchron.
Unter Android gibt es mehrere Bibliotheken, die diesen asynchronen Prozess ermöglichen.
Ich habe diesmal RxJava verwendet, Sie können andere Bibliotheken wie LiveData verwenden. Der Grund, warum ich mich für RxJava entschieden habe, ist übrigens Ich dachte, dass es viele Anwendungsbeispiele und viele Fälle gibt, Dies liegt daran, dass ich dachte, es sei im Vergleich zu LiveData "verwelkt".
Dieses Mal werde ich nicht über Reactive Programming oder RxJava erklären. Für weitere Details, wenn Sie googeln, erhalten Sie verschiedene Treffer, also dort ...
Außerdem wird vorerst nur die minimal notwendige Erklärung gegeben, um sich zu bewegen Wenn Sie es für geschäftliche Zwecke verwenden, überprüfen Sie es bitte **.
Hier können Sie auf die Erklärungsquelle verweisen.
Die entsprechende Quelle ist hier
Observable.create(new ObservableOnSubscribe<GithubRepositoryApiResponseEntity>() {
@Override
public void subscribe(ObservableEmitter<GithubRepositoryApiResponseEntity> emitter) throws Exception {
//Asynchrone Verarbeitung
Request request = new Request.Builder()
.url(url)
.get()
.build();
OkHttpClient client = new OkHttpClient();
try {
Response res = client.newCall(request).execute();
String responseBodyStr = res.body().string();
//Objektiviere json mit GSON
Gson gson = new Gson();
GithubRepositoryApiResponseEntity responceData = (GithubRepositoryApiResponseEntity) gson.fromJson(responseBodyStr, GithubRepositoryApiResponseEntity.class);
emitter.onNext(responceData);
emitter.onComplete();
} catch (Exception e) {
e.printStackTrace();
emitter.onError(e);
} finally {
loading = false;
}
}
})
.observeOn(Schedulers.newThread()) //nach beobachtenOn(Antwort)Mach es in einem neuen Thread
.subscribeOn(Schedulers.newThread()) //Mach es asynchron in einem neuen Thread
.subscribe(observer); //Lauf
Übergeben Sie eine anonyme Klasse vom Typ ObservableOnSubscribe
Geben Sie in emitter.onNext den Stream an (Ergebnis von Observer empfangen). Vergessen Sie dann nicht, "emitter.onComplete ();" aufzurufen. Das abnormale System ist "emitter.onError (Exception)".
Übergeben Sie das Ergebnis von Observable.create an ObservOn und
Gibt den zu verarbeitenden Thread an.
Wenn Sie "AndroidSchedulers.mainThread ()" angeben, wird es im Hauptthread ausgeführt.
Wenn Sie Schedulers.`` newThread`` ()
angeben, wird es auf einem neuen Thread ausgeführt (der den Hauptthread nicht stört).
Geben Sie abschließend den Beobachter in der Abonnementmethode an und registrieren Sie sich.
Die entsprechende Quelle ist hier
private Observer observer = new Observer<GithubRepositoryApiResponseEntity>() {
GithubRepositoryApiCompleteEventEntity eventResult = new GithubRepositoryApiCompleteEventEntity();
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(GithubRepositoryApiResponseEntity response) {
eventResult.setResult(false);
List<GithubRepositoryApiResponseEntity.Repository> repositoryList = response.getItems();
ArrayList<GithubRepositoryListItemEntity> data = new ArrayList<>();
for (GithubRepositoryApiResponseEntity.Repository repository : repositoryList) {
GithubRepositoryListItemEntity listItem = new GithubRepositoryListItemEntity();
listItem.setFullName(repository.getFull_name());
data.add(listItem);
}
eventResult.setListItems(data);
if (response.getItems() != null && response.getItems().size() > 0) {
eventResult.setResult(true);
}
//Rufen Sie eine Veranstaltung an
RxBus.getInstance().send(eventResult);
}
@Override
public void onError(Throwable e) {
//Rufen Sie eine Veranstaltung an
RxBus.getInstance().send(eventResult);
}
@Override
public void onComplete() {
}
};
Zuerst werde ich das nächste Mal den folgenden RxBus erklären. RxBus.getInstance().send(eventResult);
Definieren Sie zunächst eine Instanz vom Typ Observer
onSubscribe ist eine Methode, die ausgeführt wird, wenn die Datenvorbereitung abgeschlossen ist. Die Benachrichtigung kann mit dem Argument Disposable abgebrochen werden (Es ist nicht bekannt, ob es sinnvoll ist, zu diesem Zeitpunkt zu veröffentlichen ...)
onNext ist eine Methode, die ausgeführt wird, wenn Daten fließen. Dieses Mal erhalten Sie das API-Ergebnis nur einmal. In diesem Beispiel wird es zur Anzeige durch die Entitätsklasse ersetzt. Ich denke, es ist unnötig, wenn Gson und Data Binding als Set definiert werden können. (Ich dachte, es wäre nicht so tödlich, also habe ich es so gelassen, wie es war)
onError ist eine Methode, die aufgerufen wird, wenn ein Fehler auftritt. Ich habe es in diesem Beispiel nicht verarbeitet Tun Sie etwas, wenn Sie müssen.
onComplete ist eine Methode, die ausgeführt wird, wenn der Datenfluss beendet ist.
Es war so.
ViewModel ist persistent (enthält eine Instanz in einer Unterklasse von Application) Grundsätzlich glaube ich nicht, dass der Lebenszyklus Auswirkungen hat. Dies wirkt sich jedoch aus, wenn Ansicht (Aktivität und Fragment) beteiligt ist.
Deshalb war es eine kurze Erklärung der asynchronen Verarbeitung durch RxJava. Es scheint schwierig zu sein, RxJava für verschiedene Dinge zu verwenden. Vorerst aus dem aktuellen Legacy-Code Es erscheint möglich, die asynchrone Verarbeitung zu ersetzen.
Nächstes Mal möchte ich die Ereignisbenachrichtigung von RxBus erläutern.
Recommended Posts