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

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

西门胜涝
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

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

    • 问题是 我有一个活动,它定期从API获取数据并显示收到的数据。API 使用 OAuth,因此我会收到一个临时访问令牌,该令牌在一段时间(1 小时)后过期。如果应用尝试使用过期的令牌获取数据,则显然请求将失败。在我的应用的早期迭代中,我对网络请求使用 AsyncTasks,基本上只是执行了一个新的异步任务,该任务将在调用从服务器获取数据的主异步任务之前获取新的访问令牌。这工作得很好,因为主要的Asy