RXJava2管理订阅

时间:2018-01-31 22:38:23

标签: java rx-java2 publishsubject

我需要澄清使用RxJava2管理特定场景的最佳方法是什么(整个应用程序结构基于它):

在我的应用程序中,很多人可以在同一个文档中进行更改,因此我需要向每个查看文档的人提供所有更改。但是这个对象非常复杂和沉重,所以当最后一个人关闭它时我需要从内存中删除它。还有更多:文档可以是来自其他文档的子文档,因此必须将父文档中的每个更改发送给所有子文档。

到目前为止我做了什么:我创建了一个经理,所以每个文档请求都会出现。每当有人需要处理文档时,如果文档已经打开,我会在Map中查看。如果不是,我创建一个BaseDocument实例,它接收来自文档的数据和一个PublishSubject来分发事件并添加到该地图。然后我在PublishSubject上订阅用户的Observer以获取更改。每当用户需要更改某些内容时,它会将更改发送到BaseDocument,它会进行更改并通过onNext()将新版本发送给每个人。到目前为止一切都很好。

我的问题是,当有人处理文档观察者时我无法控制,因此我无法控制何时不再需要文档,因此我可以保留任何未保存的更改并销毁对象。我找不到任何订阅列表或类似的东西,除了" hasObservers()"如果一切都完成,我不想添加计时器来轮询它以关闭。

我的#34;神奇的回答"将是最后一个订户处理时调用的回调,所以我可以清理房子并抛弃整个物体,但我找不到这样的东西。那么,我该如何管理订阅呢?

1 个答案:

答案 0 :(得分:1)

其中一种方法是计算订阅和处置的数量。如果数字达到0,则删除文档。它看起来像这样:

int numberOfSubscribers = 0;

...

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

当然你需要在这里添加对并发问题的支持(synchronized / atomic int),这只是一个草案。

希望这会有所帮助:)