/ / RXJava2 spravovať odbery - java, rx-java2, publishsubject

RXJava2 spravovať odbery - java, rx-java2, publishsubject

Musím objasniť, aký je najlepší spôsob riadenia konkrétneho scenára pomocou RxJava2 (na ňom je založená celá štruktúra aplikácie):

V mojej aplikácii môže urobiť veľa ľudíten istý dokument, takže potrebujem dodať každú zmenu všetkým, ktorí sa pozerajú na dokument. Ale tento objekt je veľmi zložitý a ťažký, takže ho musím odstrániť z pamäti, keď ho posledný človek zatvorí. A ďalšie: Dokument môže byť dieťaťom z iného dokumentu, takže každá zmena v nadradenom dokumente musí byť odoslaná všetkým deťom.

Čo som doteraz urobil: Vytvoril som manažéra, takže k nemu pristupuje každá žiadosť o dokument. Keď niekto potrebuje pracovať s dokumentom, pozerám sa na mape, ak je dokument už otvorený. Ak tomu tak nie je, vytvorím inštanciu BaseDocument, ktorá prijíma dáta z dokumentu a PublishSubject na distribúciu udalostí a pridanie na túto mapu. Potom si prihlásim používateľského pozorovateľa na PublishSubject, aby som získal zmeny. Kedykoľvek používateľ potrebuje niečo zmeniť, odošle zmenu na BaseDocument, vykoná zmenu a zašle novú verziu cez onNext () všetkým. Zatiaľ je všetko dobré.

Môj problém je, že nemôžem ovládať, kedy niektodisponuje pozorovateľom dokumentu, takže nemôžem kontrolovať, kedy už nie je potrebný dokument, aby som mohol pretrvávať akékoľvek neuložené zmeny a zničiť objekt.Nemôžem nájsť žiadny zoznam prihlásení alebo niečo podobné, okrem "hasObservers ()" a Nechcel by som pridať časovač, ktorý by mohol zavrieť, ak sa všetko skončí.

Moja "zázračná odpoveď" by bola spätnou väzbousa volá, keď posledný účastník disponuje, takže by som mohol len vyčistiť dom a vyhodiť celý objekt preč, ale nemôžem nájsť nič podobné .. Takže ako môžem spravovať predplatné?

odpovede:

0 pre odpoveď č. 1

Jedným z prístupov by bolo spočítať počet objednaných a disponuje. Ak číslo narazí na 0, odstráňte dokument. Mohlo by to vyzerať takto:

int numberOfSubscribers = 0;

...

public Observable<T> expose(){
return subject.asObservable()
.doOnSubscribe(()-> numberOfSubscribers++)
.doOnDispose(()-> {
numberOfSubscribers--;
if (numberOfSubscribers == 0){
//remove the object
}
});

Samozrejme musíte pridať podporu pre problém súbežnosti tu (synchronizovaný / atomový int), to je len koncept.

Dúfam, že to pomôže :)