当前位置: 首页 > 知识库问答 >
问题:

可观察到。创建和观察者处置

袁恩
2023-03-14

我试图理解当我使用

    Observable.just(1).subscribe(new Observer<Integer>() {

        Disposable disposable;

        @Override
        public void onSubscribe(Disposable disposable) {
            System.out.println("Subscribed");
            this.disposable = disposable;
        }

        @Override
        public void onNext(Integer integer) {
            System.out.println(integer);
            System.out.println(disposable.isDisposed());
        }

        @Override
        public void onError(Throwable throwable) {
            System.out.println("Error");
            System.out.println(disposable.isDisposed());
        }

        @Override
        public void onComplete() {
            System.out.println("Complete");
            System.out.println(disposable.isDisposed());
        }
    })

On完成OnError之后,disposable.isDispse()在我使用时返回true

  Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> observableEmitter) throws Exception {
            if (!observableEmitter.isDisposed())
                observableEmitter.onComplete();
        }
    }).subscribe(new Observer<Integer>() {

        Disposable disposable;

        @Override
        public void onSubscribe(Disposable disposable) {
            System.out.println("Subscribed");
            this.disposable = disposable;
        }

        @Override
        public void onNext(Integer integer) {
            System.out.println(integer);
            System.out.println(disposable.isDisposed());
        }

        @Override
        public void onError(Throwable throwable) {
            System.out.println("Error");
            System.out.println(disposable.isDisposed());
        }

        @Override
        public void onComplete() {
            System.out.println("Complete");
            System.out.println(disposable.isDisposed());
        }
    }); 

我知道是一次性的。isDisposed()返回false。有人能解释一下到底发生了什么吗?。我理解一个写得很好的观察。create不能在onComplete()或onError()之后发出项。

共有2个答案

苏磊
2023-03-14

最初,isDispse旨在指示调用了dispose。由于默认情况下onErroron完整不调用dispose,因此您通常不会在终止后获得isDispsetrue。Reactive Streams规范规定,当调用onErroron完整时,应考虑取消订阅,这意味着无需在实现中存在实际代码(因此开销)。

不幸的是,人们开始在流之外使用它作为完成指示符(即,查看特定的订阅()是否已达到其终端状态)。我不建议依赖isDispse(在Disposable容器之外),因为它将对完成的异步反应与可能的同步(和阻塞)等待完成混为一谈。

在您的特定情况下,在返回onComplete后,一次性将指示isDisposed,因此外部视图将指示isDisposedtrue。

陶法
2023-03-14

一次性只保留对订阅的引用,为了处理它,您需要调用一次性。dispose(),可观察的不会在complete方法上处理一次性的实例。

 @Override
        public void onComplete() {
            System.out.println("Complete");
            disposable.dispose();
            System.out.println(disposable.isDisposed());
        }
 类似资料:
  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首

  • 是否有一种设计模式可以形成一个“复合”观察者/可观察者? 我的意思是我有一个可观察的,它在某个变化时通知它的监听器。 每个监听器也是一个可观察的,并通知它自己的监听器(在某个动作上,它做了哪个动作是由第一个可观察的通知触发的)。 这种观察者/可观察的“链接”作为设计是可以的,还是有一个标准的模式?

  • 我们支持使用分布式消息系统,例如 etcd 来保持多个Casbin执行器实例之间的一致性。 因此,我们的用户可以同时使用多个Casbin 执行器来处理大量的权限检查请求。 与策略存储 adapters类似,我们没有把watcher的代码放在主库中。 任何对新消息系统的支持都应该作为watcher程序来实现。 完整的Casbin watchers列表如下所示。 欢迎任何第三方对 watcher 进行

  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular

  • 假设我有一个,它从网络获取数据并发出数据,如果我订阅这个observable,每次它试图从网络请求数据时,它会很重。 我想创建BehaviorSubject并将其连接到observableA,这样任何其他线程/对象都将订阅BehaviorSubject以获取最新发出的数据。 到目前为止,我还不能用它来编码。我不能创建空的BehaviorSubject并在observableA内调用,因为它们彼此不

  • ORM类底层提供了Observer支持,可以在数据更新、删除、插入时通知观察者。 $user1 = Model('User')->get(1); $user1->attach(new \App\Observer\UserUpdate()); $user->mobile = '18948735886'; $user->save(); 观察者类 namespace App\Observer; cl