RXJava2 управлять подписками

Мне нужно уточнить, как лучше всего управлять конкретным сценарием с использованием RxJava2 (на нем основана вся структура приложения):

В моем приложении многие люди могут вносить изменения в один и тот же документ, поэтому мне нужно донести каждое изменение до всех, кто просматривает документ. Но этот объект очень сложный и тяжелый, поэтому мне нужно удалить его из памяти, когда его закроет последний человек. И еще: документ может быть дочерним по отношению к другому документу, поэтому каждое изменение в родительском документе должно быть отправлено всем дочерним.

Что я сделал до сих пор: я создал менеджера, поэтому каждый запрос документа приходит к нему. Всякий раз, когда кому-то нужно поработать с документом, я смотрю на карте, открыт ли документ. Если это не так, я создаю экземпляр BaseDocument, который получает данные из документа, и PublishSubject для распространения событий и добавления их на эту карту. Затем я подписываюсь на наблюдателя пользователя на PublishSubject, чтобы получить изменения. Всякий раз, когда пользователю нужно что-то изменить, он отправляет изменение в BaseDocument, вносит изменение и отправляет новую версию всем через onNext(). Все идет нормально.

Моя проблема в том, что я не могу контролировать, когда кто-то удаляет наблюдатель документа, поэтому я не могу контролировать, когда документ больше не нужен, поэтому я могу сохранить любые несохраненные изменения и уничтожить объект. Я не могу найти список подписки или что-то подобное, кроме «hasObservers ()», и я не хочу добавлять таймер, чтобы опросить его, чтобы закрыть, если все сделано.

Моим «чудесным ответом» был бы обратный вызов, который вызывается, когда последний подписчик избавляется, поэтому я мог бы просто убрать дом и выбросить весь объект, но я не могу найти ничего подобного. Итак, как я могу управлять подписками?


person Fernando Augusto    schedule 31.01.2018    source источник
comment
Вы можете разделить модулированное PublishSubject как Observable с doOnDispose и share, чтобы вас вызывали, когда последний наблюдатель удаляется.   -  person akarnokd    schedule 01.02.2018


Ответы (1)


Одним из подходов может быть подсчет количества подписок и удалений. И если число достигает 0, удалите документ. Это будет выглядеть примерно так:

int numberOfSubscribers = 0;

...

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

Конечно, вам нужно добавить здесь поддержку проблемы параллелизма (синхронизированный/атомарный int), это всего лишь черновик.

Надеюсь это поможет :)

person Kamil Dziadek    schedule 01.02.2018
comment
Отлично. Это помогает на 100%. Спасибо! - person Fernando Augusto; 02.02.2018