[JAVA] Ereignisbehandlung mit RxBus unter Android

Einführung

Bis zu Letztes Mal habe ich die Daten von der API abgerufen und zu ViewModel gebracht. Dieses Mal werde ich den Teil erklären, der von ViewModel nach View gebracht werden soll, Ereignisverarbeitung.

Voraussetzungen

Die Voraussetzungen für den hier erläuterten Code finden Sie unter hier.

Über die Notwendigkeit der Ereignisverarbeitung

ViewModel muss View (Aktivität und Fragment) über das Ergebnis der asynchronen Verarbeitung (z. B. API) informieren. Wenn zu diesem Zeitpunkt der Rückgabewert in der synchronen Verarbeitung empfangen wird, wird der Haupt-Thread eingefroren. Wenn das ViewModel über eine View-Referenz verfügt, muss das ViewModel den Lebenszyklus kennen und Ansicht ist nicht erforderlich, da Ansicht für den Komponententest von ViewModel erforderlich ist. Daher verwende ich ein Ereignis, um es nur zu empfangen, wenn die Ansicht aktiv ist.

Gründe für die Wahl von RxBus.

EventBus ist eine bekannte Bibliothek zur Behandlung von Ereignissen. Der Grund für die Verwendung von RxBus dieses Mal ist Es gab eine Geschichte, in der die Benachrichtigung von EventBus schwer zu verstehen war, deshalb habe ich mich für RxBus entschieden.

Dies liegt daran, dass EventBus Ereignisse global registriert. Im Moment scheint es, dass es von der Implementierung wie folgt abhängt. https://qiita.com/subaru44k/items/27cd4828edc65cd9d7a6

In diesem Sinne könnte EventBus angesichts der Lernkosten gut gewesen sein. Ein weiterer Vorteil der Verwendung von RxBus besteht darin, dass die verwendeten Bibliotheken in die asynchrone Verarbeitung integriert werden können. Es gibt keinen Grund, RxBus zu verwenden, nur weil Sie RxJava verwenden. RxJava und EventBus sind ebenfalls in Ordnung.

Ich denke, dass dieser Bereich entsprechend der Situation des Teams ausgewählt werden sollte.

Ereignismechanismus von RxBus

Wenn Sie in RxBus am Verwendungsort auf dieselbe RxBus-Instanz zugreifen (z. B. View und ViewModel), Es ermöglicht den Austausch von Ereignissen. Ich versuche, eine Instanz von RxBus in einer einzigen Tonne zu bekommen. Die Registrierung und Überwachung von Ereignissen kann jetzt von überall aus lose gekoppelt werden.

Anfangs hatte Application eine Instanz, Wenn ich einen Komponententest durchführe, kann ich ihn nicht ausführen, da ich keine Anwendung habe. Daher habe ich mich für Singleton entschieden. Ich habe mich gefragt, ob es in Ordnung ist, weil es funktioniert, wenn ich den Test mit Android Test durchführe Ich benutze jetzt eine Tonne.

RxBus und Lebenszyklus

Wenn Sie das registrierte Ereignis während der Verwendung in der Ansicht nicht während des Lebenszyklus freigeben, Es kann auslaufen oder zu einem Fehler ohne Referenz führen. Details werden später erklärt, aber wenn sich die Aktivität oder das Fragment zurückzieht oder freigegeben wird, Sie müssen das Ereignis auch nicht überwachen.

Beispielcode

RxBus-Implementierung.

Definieren Sie zunächst RxBus. Die Quelle ist hier.

    public class RxBus {
        private final PublishSubject<Object> bus = PublishSubject.create();
        private static RxBus rxBus;
    
        private RxBus() {
    
        }
    
        public static RxBus getInstance() {
            if (rxBus == null) {
                rxBus = new RxBus();
            }
            return rxBus;
        }
    
        public void send(final Object event) {
            bus.onNext(event);
        }
    
        public Observable<Object> toObservable() {
            return bus;
        }
    
        public boolean hasObservers() {
            return bus.hasObservers();
        }
    }

Definieren Sie eine Instanz von "PublishSubject", die das Ereignis tatsächlich registriert. Definiert, um eine eigene Instanz als Singleton zurückzugeben.

Beispiel für das Senden eines Ereignisses mit RxBus

Es ist ein Prozess, der tatsächlich RxBus verwendet und das von der API asynchron erhaltene Ergebnis an View übergibt. Die Quelle ist hier.

    GithubRepositoryApiCompleteEventEntity eventResult = new GithubRepositoryApiCompleteEventEntity();
    eventResult.setListItems(data);
    if (response.getItems() != null && response.getItems().size() > 0) {
            eventResult.setResult(true);
    }
    
    //Rufen Sie eine Veranstaltung an
    RxBus.getInstance().send(eventResult);

Die in der Entität erfassten Daten, die zum Austausch von Ereignissen mit dem Namen "GithubRepositoryApiCompleteEventEntity" verwendet werden, und das Erfassungsergebnis werden gespeichert. Geben Sie diese Instanz als Argument des Ereignisses an und senden Sie das Ereignis.

Beispiel für den Empfang eines Ereignisses mit RxBus

Es ist ein Prozess, um das von RxBus gesendete Ereignis zu empfangen. Die Quelle ist hier.

            this.compositeDisposable = new CompositeDisposable();
            this.compositeDisposable.add(RxBus.getInstance()
                    .toObservable()
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<Object>() {
                        @Override
                        public void accept(Object obj) {
                            if (obj instanceof GithubRepositoryApiCompleteEventEntity) {
                                //Ergebnisse auflisten
                                if (((GithubRepositoryApiCompleteEventEntity) obj).isResult()) {
                                    RecyclerView list = view.findViewById(R.id.githubRepositoryList);
                                    list.setLayoutManager(new LinearLayoutManager(view.getContext()));
                                    list.setAdapter(new GithubRepositoryListAdapter(((GithubRepositoryApiCompleteEventEntity) obj).getListItems()));
                                    list.setVisibility(View.VISIBLE);
                                    list.addItemDecoration(new DividerItemDecoration(view.getContext(), DividerItemDecoration.VERTICAL));
                                }
                                view.findViewById(R.id.progressBar).setVisibility(View.GONE);
                            }
                            //Behandeln Sie keine anderen Ereignisse
                        }
                    }));
    
            ExpApplication.getInstance().getViewModelLocator().getGithubRepositoryListViewModel().getRepositoryListData();
            
    //~ Ausgelassen ~
            
        @Override
        public void onStop() {
            super.onStop();
            this.compositeDisposable.clear();
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            this.compositeDisposable.clear();
        }

Definieren Sie eine Instanz von "CompositeDisposable" und Stellen Sie dies auf RxBus-Ereignisempfangsverarbeitung ein. Durch Aufrufen von "CompositeDisposable.clear ()" mit onStop () oder onDestroy () und Abbrechen der Überwachung Es kann entlang des Lebenszyklus verarbeitet werden.

Verarbeitung des RxBus-Ereignisempfangs nach dem Aufruf von ".toObservable ()" Gibt den Thread an, der mit ".observeOn (AndroidSchedulers.mainThread ())" verarbeitet werden soll. Da ich mit dem Bildschirm herumspiele, verwende ich diesmal den Haupt-Thread. Sie können es auch in einem anderen Thread als Main mit "Schedulers.newThread ()" ausführen. .subscribe (new Consumer <Object> () { Der spezifische Empfangsprozess wird nachfolgend beschrieben.

public void accept (Object obj) { Das Folgende ist der Empfangsprozess, Das im Übertragungsprozess angegebene Argument wird als Objekttypvariable gesendet. if (obj Instanz von GithubRepositoryApiCompleteEventEntity) { bestimmt den Typ und Es wird festgelegt, ob es sich um das Ereignis handelt, das Sie empfangen möchten. Wenn es sich um ein zu empfangendes Ereignis handelt, wird es verarbeitet.

abschließend

Also habe ich versucht, RxBus zu erklären. Nächstes Mal möchte ich sqLite nach Raum erklären.

Recommended Posts

Ereignisbehandlung mit RxBus unter Android
Kompatibel mit Android 10 (API 29)
[Android] Hinweise zu XML
Firebase-Realtime-Datenbank für Android, die mit Kopie verwendet werden kann
Passen Sie die Listenansicht auf Android an
Mehrteilige Übertragungsbibliothek auf Android
Verwenden Sie die serielle Kommunikation unter Android
ROS App Entwicklung auf Android
Verwenden Sie nativen Code unter Android
RxJava (RxAndroid) + RxBus + Datenbindung + Raumbeispiel (basierend auf Java 1.7) auf Android.