【问题标题】:Rxjava booleanSupplier expectedRxjava booleanSupplier 预期
【发布时间】:2018-03-23 14:11:12
【问题描述】:

您好,我正在尝试使用 rxjava repeatUntil 轮询请求,但出现了一些错误

下面是我的代码

accountDelegator.signUpReady(signUpRequest)
                .observeOn(Schedulers.io())
                .subscribeOn(AndroidSchedulers.mainThread())
                .repeatUntil { response -> 
                    if (response.isSuccesfull){
                        return onComplete()
                    }
            }

它说它需要一个 booleanSupplier 而不是一个单位?

我只是想重复上面的请求,直到我得到一个 response.isSuccessful 然后返回 onComplete() 就像在 rxjava 文档中它指出要退出 repeatUntil 观察者,你必须调用 onComplete

【问题讨论】:

  • onComplete() 返回类型?

标签: android kotlin rx-java2


【解决方案1】:

repeatUntil 不向其BooleanSupplier 函数提供任何项目,该函数应指示是否重复上游。要“退出”它,你必须从函数中返回 true,因为你不能在那里调用 onComplete(这也没有意义,你可能误解了文档)。

您可以改用 filtertake 来停止重复序列:

accountDelegator.signUpReady(signUpRequest)
            .subscribeOn(Schedulers.io())
            .repeat(/* 100 */)
            .filter { response -> response.isSuccessful }
            .take(1)
            .observeOn(AndroidSchedulers.mainThread());

您还希望通过repeatWhen 限制重试次数和/或将重复延迟一段时间(这样您的代码就不会因为不成功而向服务器发送垃圾邮件)。

编辑

要详细说明关于延迟重试的最后一句话,这里有一种方法:

.repeatWhen { completion -> completion.delay(1, TimeUnit.SECONDS) }

而不是repeat(100)。当上游完成时,通过completion 向对象发出信号,然后延迟 1 秒。之后,repeatWhen 中的另一端接收到触发重新订阅上游的对象。

【讨论】:

  • 错字。应该是 .filter{response -> response.isSuccessful} 大括号?
  • 我永远无法知道 Kotlin 将如何与 SAM 类型交互,尤其是因为它取决于您的 Kotlin 版本。尝试使用和不使用外大括号。
  • 用括号试过了,不行,需要花括号。似乎它确实会触发 n 个请求,而实际上并没有等待每个请求的响应?如何延迟每个请求?
  • 好吧,酷我试试看。如果我用repeatWhen替换repeat(n)次。它会一直持续下去,我将不得不手动退出循环吗?我该怎么做?理想情况下,我想在响应时执行此操作。IsSuccesful 是真的
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多