使用后我是否需要释放/释放Observable对象?

时间:2017-06-30 23:07:24

标签: rx-java rx-java2

我使用它后是否需要释放/释放Observable对象,以防Observable对象没有被GC吞噬?我没有找到任何文章提及它。 GC会自动使用Observable对象吗?

 Observable.create(new ObservableOnSubscribe<Boolean>() {
        @Override
        public void subscribe(ObservableEmitter<Boolean> e) throws Exception {
            boolean connected = true;
            //my logic code here
            e.onNext(connected);
            e.onComplete();
            e.setCancellable(null);
            //Do I need to do some extra release/free Observable object work in case Observable object is not garbaged by GC?
        }
    }).subscribeOn(Scheduler.ioThread())
            .observeOn(Scheduler.mainThread())
            .subscribe(new Consumer<Boolean>() {
                @Override
                public void accept(Boolean connected) throws Exception {
                    //my logic code here.
                    //Do I need to do some extra release/free Observable object work in case Observable object is not garbaged by GC?
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    //my logic code here.
                    //Do I need to do some extra release/free Observable object work in case Observable object is not garbaged by GC?
                }
            });

2 个答案:

答案 0 :(得分:2)

Observable不会自动“释放”任何内容,但会为您提供相应的工具  Observable有一些资源管理方面:

  • 释放与'Producer'相关联的任何资源 - 生成事件的资源,此资源可以是来自IO相关资源的任何资源 - 网络查询,一些硬件/传感器相关事件,DB触发器; UI相关资源 - 点击,滚动等。
    这需要由Observable给你的框架管理,它是Cancellable / Disposable组件,框架保证在适当的时间触发此事件 - 当Observable完成时,取消订阅/处置Observable时。但是你可以触发相应的逻辑 - 取消网络查询,关闭/释放/关闭IO资源,从你的监听器取消注册等等,这一切都取决于你的制作人逻辑
  • 当您的资源不再需要时,显式地从Subscriber处理/取消订阅Obesrvable - 而Observable为您提供了清除资源的框架,您可以在显式时间触发它。虽然Observable会在Observable完成时自动触发它,有时候太晚了你想要取消它(即网络查询),而在其他情况下你的Observable可能是无限项,想想DB插入监听器,点击事件或者任何其他监听器,在这种情况下,资源将被暂停,直到您通过处置Observable明确释放它为止。
  • 解除(处置)ObservableSubscriber之间的连接以防止内存泄漏也很重要,因为Subscriber可能包含对包装类的硬性引用,因此将被Observable泄露。 (带有UI组件的经典,其中订阅者引用一些UI类并订阅一些静态性Observable
  • 值得注意的是,处理Observable会触发Thread中断到Producer订阅线程。所以如果你在那里进行IO操作,你可能会遇到InterruptedException。

答案 1 :(得分:1)

在大多数情况下,我们不需要显式调用unsubscribe方法,除非我们想要提前取消或我们的Observable的寿命比我们的订阅更长。 Observable操作符的默认行为是在发布.complete()或.error()消息后立即处理订阅。请记住,RxJS的设计大多数时候都是以“一见不醒”的方式使用。 read