【问题标题】:Retrofit and Rxjava not sending request改造和 Rxjava 不发送请求
【发布时间】:2021-06-04 18:21:21
【问题描述】:

我正在尝试使用 RxJava 实现 Retrofit。我已经找到了关于该主题的每个教程中显示的所有组件,但实际上我没有看到任何请求开始。我错过了什么?将Retrofit转换为RxJava意味着没有.enqueue()可以调用,那么为什么没有发送请求呢?该应用程序具有互联网权限,我已经在模拟器和物理设备上对其进行了测试。我该怎么做才能进一步调试问题?

@GET("things/{thing}")
    fun getThing(@Path("thing") thingName: String): Observable<Thing>
private val service: ThingsService

init {
    val clientBuilder = OkHttpClient.Builder()
    clientBuilder.addInterceptor(HttpLoggingInterceptor())

    val retrofit = Retrofit.Builder()
        .baseUrl("https://example.com")
        .client(clientBuilder.build())
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
        .build()

    service = retrofit.create(ThingsService::class.java)
}

fun test(thingName) {
    val aThing = service.getThing(thingName)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ thing -> }, { error -> })
}

使用此配置,我永远不会看到记录的请求。

【问题讨论】:

  • 如何运行测试?您是否在 Junit-Runner-Thread 中运行它?可能是这种情况,由于线程化,方法test 调用失败并且程序退出。你能给我们一些关于你如何称呼测试的背景吗?
  • 只是一个占位符方法名。实际方法是从 UI 交互中调用的,我已经验证该方法实际上正在被调用。
  • 我无法验证是否调用了改造方法,因为没有地方可以放置调试器,但肯定会调用 service.getThing()
  • 您在 logcat 中看到任何错误吗?可能是这种情况,从主线程进行 http 调用,这在 Android 中是被禁止的,这反过来会引发错误。当您添加getThing(t).subscribeOn(Schedulers.io).doOnNext { log stuff out hier } 时会发生什么。你在 logcat 中看到一些输出吗?也请注销 onNext 和 onError。当你什么都没有覆盖 onError 时,你什么也看不到。
  • 如果我切换回使用标准 Call 对象,是的,它会在主线程异常上引发网络,但如问题所示,似乎没有线程是正确的。没有任何内容被打印到日志中,没有错误,并且在 .subscribe() .doOnNext() 中的日志语句永远不会被调用。

标签: android retrofit rx-java


【解决方案1】:

完全看不到输出的问题是几个问题的结合:

  1. 虽然我测试在.subscribe() 块中放置一条日志语句,但我没有在错误块中放置一条。

  2. HttpLoggingInterceptor 上的日志级别未正确设置以记录发生的错误类型。

  3. 在其中一台设备(模拟器)上,未正确授予 Internet 权限,因为该权限是在首次安装后添加到清单文件中的。

解决方案:

添加上网权限后删除重新安装应用,检查错误块中的内容,并确保在拦截器中设置正确的日志级别:

val interceptor = HttpLoggingInterceptor().apply {
   level = HttpLoggingInterceptor.Level.BODY
}

val client = OkHttpClient.Builder().apply {
    if (BuildConfig.DEBUG) {
        addInterceptor(interceptor)
    }
}.build()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2018-11-13
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多