使用后是否需要 free/release Observable 对象?

Do I need to free/release Observable object after I use it?

在使用 Observable 对象后是否需要 free/release 以防 Observable 对象不被 GC 丢弃?我没有找到任何文章提及它。 Observable 对象是否被 GC 自动丢弃?

 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?
                }
            });

Observable 不会自动 "free" 任何东西,但会为您提供执行此操作的工具。
Observable 的资源管理有一些方面:

  • 释放与'Producer'相关的任何资源——生成事件的资源,这个资源可以是任何来自IO相关资源——网络查询、一些hardware/sensor相关事件、DB触发器; UI 相关资源 - 点击、滚动等
    这需要你用 Observable 给你的框架来管理,它是 Cancellable/Disposable 组件,框架保证这个事件将在适当的时间触发 - 当 Observable 完成时, 当 unsubscribing/disposing Observable.但是触发适当的逻辑取决于您 - 取消网络查询,shutdown/release/close IO 资源,从您的监听器中注销等,都取决于您的生产者逻辑
  • Disposing/unsubscribing 当您的资源不再需要时,Obesrvable 中的 Subscriber 显式 - 虽然 Observable 为您提供了清除资源的框架,但由您来触发它在明确的时间。虽然 Observable 会在 Observable 完成时自动触发它,但有时为时已晚,你想在之前取消它(即网络查询),而在其他情况下你的 Observable 可能有无限项,想想数据库插入监听器,点击事件或任何其他侦听器,在这种情况下,资源将被保留,直到您通过处置 Observable.
  • 显式释放它
  • 解开(处理)ObservableSubscriber 之间的连接也很重要,以防止内存泄漏,因为 Subscriber 可能持有对包装 classes 因此会被 Observable 泄露。 (classic 与 UI 组件,其中订阅者引用一些 UI class 并订阅一些静态性质 Observable
  • 需要注意的是,释放Observable会触发Thread中断到Producer订阅线程。所以如果你在那里有 IO 操作,你可能会得到 InterruptedException。

在大多数情况下,我们不需要显式调用取消订阅方法,除非我们想提前取消或者我们的 Observable 的生命周期比我们的订阅更长。 Observable 运算符的默认行为是在发布 .complete() 或 .error() 消息后立即处理订阅。请记住,RxJS 被设计为大多数时候以 "fire and forget" 的方式使用。 read