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

RxAndroid操作员retryWhen被调用但未重新订阅

姜玉泽
2023-03-14

>

  • 使用改型的API类

    class interface TestApi {
      @GET("/path/abc/xyz") 
      fun get(): Single
    }
    

    UseCase类

    null

    fun getResult(): Single {
          return testApi.get()
            .map{ response -> 
                val type = response.type
                when(type){
                 null -> throw Exception()
                 else -> response
                } 
             }
            .retryWhen{ throwableHandler ->
                throwableHandler.flatMap {
                    when(it) {
                       is Exception() -> Flowable.error(it)
                       else -> Flowable.timer(3,TimeUnit.SECONDS)
                     }
                }
            }
            .timeout(60, TimeUnit.SECONDS)
        }
        

    null

    MainClass.kt

    usecase.getResult()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(onError = {Log.d(TAG,"Error")},
                         onSuccess = {Log.d(TAG,"Next")})
    

    应用程序运行时:
    如果api返回NULL,将调用retryWhen(),然后再次调用api。达到事件not超时,并且api返回not NUL结果->onSuccess被调用。这是RXJava中对retryWhen()运算符的正确处理。

    我的问题:
    如果我在mainclass.kt中编写一些测试方法(假装API改造),如下所示:

    private fun testPretend(): Single<Animal> {
      return Single.just(Animal)
    }
    

    mainclass.kt看起来像:

    testPretend()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeBy(onError = {Log.d(TAG,"Error")},
                         onSuccess = {Log.d(TAG,"Next")})
    

    因此调用事件retryWhen时,不会再次调用testPretend()方法。这里的问题是什么?
    以及testPrerend()的单次返回和改型API之间的区别是什么?

  • 共有1个答案

    应安国
    2023-03-14

    不会再次调用testpretend()方法,因为它返回的可观察值是要重新订阅的值。如果希望在重新订阅时再次调用该方法,则需要执行如下操作:

    Single.defer( () => testPretend() )
      ...
      .retryWhen( ... )
      ...;
    

    这将在重新订阅时调用testpretend()

     类似资料:
    • 我是写测试和使用Mockito的新手。我在Stackoverflow上阅读了类似的主题,并做了建议的更改,确保所考虑的类/接口/方法是开放的。 我试图跟踪这个 模仿构造函数注入的依赖项 这是我目前想出来的测试 但我一直得到的回应是 即使我在测试中没有提到这种方法,我也得到了这种反应。这是我的演示者注册方法。我已经改变了类/接口 同样地 这里是接口 感谢您的帮助。

    • 我在使用JSF2.0时遇到了问题。命令按钮不调用bean,我已经阅读了balusc应答commandbutton/commandlink/ajax action/listener方法未调用或输入值未更新,但我认为我不会遇到这些情况,这就是我使用的代码: 更新1:

    • 重试时间:io.reactivex.subjects.serializedsubject@35fb3008 subscribeNext 进程已完成,退出代码为0

    • 我有一个JSF页面,其中有一个具有ajax=true的p:命令按钮,并在单击时呈现一个包装在p: outputGroup中的p:面板。当单击此按钮时,action方法将在ManagedBean中将show CreateUser值设置为true,这用于呈现面板。这工作正常——单击按钮后面板会正确呈现。在p:面板内还有另一个p:命令按钮。这个命令按钮不起作用,因为当我单击它时什么都不会发生。永远不会调

    • 公共类主{ } 第一天开始学习java。我面对一堵墙。我不知道为什么

    • 问题内容: 我有一个非常简单的Servlet和一个非常简单的HttpSessionListener: 我的方法从未被调用(没有日志输出),最终我在调用getSession()的那一行上得到一个 我尝试拨打电话时也没有问题,但存在相同的问题。 我不明白- 注释不足以调用我的侦听器吗?Eclipse甚至在下方将其显示为侦听器。 问题答案: 原来这是愚蠢的Eclipse问题之一… Project-> C