Asynchrone Verarbeitung durch RxJava (RxAndroid) unter Android

Einführung

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.

Notwendigkeit der asynchronen Verarbeitung durch Android-Anwendung

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.

Bibliothek zur Realisierung der asynchronen Verarbeitung

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".

Voraussetzungen

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 **.

Realisierung und Erklärung der asynchronen Verarbeitung durch RxJava.

Hier können Sie auf die Erklärungsquelle verweisen.

GitHub SampleAndroidApps

Verarbeitung auf der API-Ausführungsseite (Observer auf der überwachten Seite)

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 an Observable.create. ObservableOnSubscribe gibt den Typ des zu streamenden Objekts an (vom Observer empfangene Ergebnisse). Schreiben Sie den Prozess, den Sie asynchron machen möchten, in die Methode subscribe. (Diesmal wird Api aufgerufen, um das Repository von GitHub zu erhalten.)

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.

Verarbeitung auf der Seite, die das API-Ausführungsergebnis erhalten hat (Observer auf der Überwachungsseite)

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 . T gibt den Objekttyp an, der von Observable ausgeht.

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.

Über den Lebenszyklus

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.

abschließend

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

Asynchrone Verarbeitung durch RxJava (RxAndroid) unter Android
RxJava (RxAndroid) + RxBus + Datenbindung + Raumbeispiel (basierend auf Java 1.7) auf Android.
Android Asynchrone UI-Thread-Verarbeitung
Asynchrone Verarbeitung und Web-API-Integration in Android Studio
[Android] Hinweise zu XML
Führen Sie die Verarbeitung auf Ant aus
Informationen zum Abschneiden von Zeichenfolgen um die Anzahl der Bytes unter Android