【发布时间】: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()中的日志语句永远不会被调用。