java - RxJava轮询+手动刷新

标签 java android rx-java polling

我有一个列表想要每分钟刷新一次。 例如这里的用户列表:https://github.com/android10/Android-CleanArchitecture/blob/master/domain/src/main/java/com/fernandocejas/android10/sample/domain/interactor/GetUserList.java

我使用repeatWhen添加定期刷新:

  public Observable<List<User>> buildUseCaseObservable(Void unused) {
    return this.userRepository
        .users()
        .repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
          @Override
          public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception {
            return objectObservable.delay(1, TimeUnit.MINUTES);
          }
        });
  }

这种方式工作得很好,每分钟调用一次 onNext。 但如果我想立即刷新此列表(由于用户的操作或通知),我不知道如何执行该操作。

我应该取消/处置可观察对象并重新启动一个新的吗? 谢谢

最佳答案

从您的代码中我了解到用户列表是在订阅时生成并发出的。

以下是我能想到的一些解决方案,而不是在您想要立即使用react的事件上取消订阅并重新订阅:

  1. 不要使用 repeatWhen 运算符,而是使用 interval creation operatorflatMap 结合,每分钟调用一个新 Observable 的订阅,并使用 merge 运算符添加对您感兴趣的其他事件的 react 。像这样的事情:

    @Test
    public void intervalObservableAndImmediateReaction() throws InterruptedException {
        Observable<String> obs = Observable.interval(1, TimeUnit.SECONDS)
                    .cast(Object.class)                                          
                    .mergeWith(
                              Observable.just("mockedUserClick")
                                        .delay(500, TimeUnit.MILLISECONDS))
                    .flatMap(
                             timeOrClick -> Observable.just("Generated upon subscription")
                             );
    
        obs.subscribe(System.out::println);
        Thread.currentThread().sleep(3000); //to see the prints before ending the test
    }
    

    或根据您的需要进行调整(但原理是相同的):

    Observable.interval(1, TimeUnit.MINUTES)
                .mergeWith(RxView.clicks(buttonView))
                .flatMap(timeOrClick -> this.userRepository.users());
    
  2. 您可以像以前一样使用 flatMap 运算符,即使同时让您继续工作当前实现并且不合并到某个时间间隔 - 只需将您的工作代码保留在程序链的另一个区域中即可到RxBinding您选择的:

    RxView.touches(yourViewVariable)
          .flatMatp(motionEvent -> this.userRepository.users())
          .subscribe(theObserver);
    

    请注意,在此解决方案中,订阅是独立于两个可观察量完成的。如果你使用不同的观察者,或者管理一个主题或相关的事情,你的情况可能会更好。我运行的一个小测试显示,一个订阅者毫无问题地处理了 2 个不同的可观察量的订阅(在 Rxjava1 中 - 尚未检查 Rxjava2),但对我来说感觉不太确定。

关于java - RxJava轮询+手动刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46318838/

相关文章:

java - 如何使用 JHDF5 读取/写入 3D+ 数组?

Android - RTL布局在通货膨胀后变为LTR

android - 找不到 BLE 广告

java - RxJava : Calling . subscribe() 使用相同的观察者来处理多个 Observables

android - 无法查询使用 Realm

java - 发出 2 个可观察量,处理结果,然后发出另一个

java - 浏览器显示 IPv6,但查询返回 IPv4 - 为什么?

java - (Eclipse) 启动配置只能存在于一种模式中吗?运行还是调试?

java - 由于没有 session ,未能延迟初始化集合

android - 计算移动设备线性运动(Android)