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

为什么这个可观察的只发出一个值

西门胜涝
2023-03-14

下面的代码基于@a.bertucci提供的一个示例,这里使用Android上的RxJava以固定的间隔在UI中绘制对象,其中我使用计时器压缩了一个可观察对象。当我通过调用processDelayedItems()触发订阅时,压缩的Observable中的代码[A]只执行一次,一个项目被发送到[B]。我原本希望代码[A]在触发后继续运行,并保持每1500毫秒发出一次项,但显然它在这里只运行一次。

private static void processDelayedItems() {

    Observable.zip(
            Observable.create(new Observable.OnSubscribe<Object>() {

                @Override public void call(Subscriber<? super Object> subscriber) {
                    // [A] this code is only called once
                    subscriber.OnNext(o)
                }

            }),
            Observable.timer(1500, 1500, TimeUnit.MILLISECONDS), new Func2<Object, Long, Object>() {
                @Override public Object call(Object entity, Long aLong) {
                    return entity;
                }
            }
    )
    .subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Object>() {

                @Override public void call(Object entity) {
                    // ... and accordingly one item is emitted [B]
                }

            }, new Action1<Throwable>() {

                @Override public void call(Throwable throwable) {
                    throwable.printStackTrace();
                }

            }, new Action0() {

                @Override public void call() {

                }

            });

}

>

  • 有人能看到我这里的问题吗?是不是我需要从函数外部引用可观察的来让它保持更长时间的活动?它是由GC(Android)收集的吗?函数是静态的是个问题吗?

    就生存时间而言,可观察事物的规则是什么?是否有任何最佳实践可以引用多长时间的可观察对象,以及它们是否可以是静态的?在我的测试中,我注意到这并不重要,但在这里,当涉及计时器时,它可能会起作用。

    --

    更正代码[尚未工作]:

    >

  • 添加重复()

    Observable.zip(
            Observable.create(new Observable.OnSubscribe<Object>() {
    
                @Override public void call(Subscriber<? super Object> subscriber) {
                    // [A] this code is only called once
                    subscriber.OnNext(o);
                    subscriber.OnCompleted();
                }
    
            }).repeat(Schedulers.newThread()),
            Observable.timer(1500, 1500, TimeUnit.MILLISECONDS), new Func2<Object, Long, Object>() {
                @Override public Object call(Object entity, Long aLong) {
                    return entity;
                }
            }
    )
    .subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Object>() {
    
                @Override public void call(Object entity) {
                    // ... and accordingly one item is emitted [B]
                }
    
            }, new Action1<Throwable>() {
    
                @Override public void call(Throwable throwable) {
                    throwable.printStackTrace();
                }
    
            }, new Action0() {
    
                @Override public void call() {
    
                }
    
            });
    
  • 共有2个答案

    丰智
    2023-03-14

    关于你的评论,为了简单起见,你可以这样做,

    Observable.timer(1500, 1500, TimeUnit.MILLISECONDS)
            .flatMap(new Func1<Long, Observable<Object>>() {
                @Override
                public Observable<Object> call(Long aLong) {
                    String o = "0";
                    return Observable.from(o);
                }
            })
            .subscribe(new Action1<Object>() {
                @Override
                public void call(Object aLong) {
                    System.out.println(aLong);
                }
            });
    

    在这里,您仍然可以享受计时器带来的好处,而无需在顶部添加zip/repeat。这仍然有点冗长,但更简单一点。

    芮祺
    2023-03-14

    您需要重复才能生成无限的可观测值。例如。,

        Observable.create(new Observable.OnSubscribe<Object>() {
    
            @Override public void call(Subscriber<? super Object> subscriber) {
                // [A] this code is only called once
                if (!subscriber.isUnsubscribed()) {
                    subscriber.onNext(o);
                }
                if (!subscriber.isUnsubscribed()) {
                    subscriber.onCompleted();
                }
            }
    
        }).repeat(Schedulers.newThread());
    

    我是否需要从函数外部引用可观察到的对象,以使其在更长的时间内保持活动状态?是否由GC(Android)收集?函数是静态的,这是一个问题吗?

    因为您使用了调度程序。newThread()和计时器,将有一些其他线程引用您的可观察线程。你不需要更多的工作。

    就生存时间而言,可观察事物的规则是什么?是否有任何最佳实践可以引用多长时间的可观察对象,以及它们是否可以是静态的?在我的测试中,我注意到这并不重要,但在这里,当涉及计时器时,它可能会起作用。

    你说得对。没关系。

     类似资料:
    • 我正在用RxJava在Android中制作计时器。我需要在RxJava中制作一个计时器,以便每秒发出一个可观察的信号。我试过以下方法,但没有成功。有没有想过我做错了什么?

    • 我试图创建一个observate,它从firebase查询返回一个列表。问题是,当我调用onNext发出项目,然后调用onComplete时,它会停止发出第一个项目之后的项目,而根本不调用onComplete不会发出任何东西。有没有正确的方法来实现我想要实现的目标?我对RxJava还是很陌生,请原谅我的无知。感谢您的帮助:)

    • 函数应该从get请求返回一个 在这种情况下,我只能在为真时执行请求,否则我在函数

    • 问题:我有一个功能,用户可以输入一个查询字符串,我创建了两个可观察对象,一个用于查询本地DB,另一个用于从API获取结果。这两个操作必须并行运行。我需要尽快显示DB中的结果,当API结果返回时,我需要进行检查以删除本地结果中的重复项。 我的方法:CombineTest似乎是最接近我需要的东西。但问题是,只有当两个可见光都发出结果时,它才会发出。我想我要找的是CombineLatest和Concat

    • 我发现这样的php代码: 我希望这个循环会执行4次,因为$I变成了对$的引用(对吗?)。然而,循环只执行一次,并输出: a=10,i=10 我不明白为什么它会这样工作。有什么想法吗?

    • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块