我正在尝试用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 -> })
}
在这个配置下,我从来没有看到一个请求被记录。
看不到任何输出的问题是以下几个问题的结合:
-
当我测试在
.subscribe()
块中放置日志语句时,我没有在错误块中放置日志语句。 -
HttpLoggingInterceptor
上的日志级别没有正确设置以记录发生的错误类型。 -
在其中一个设备(模拟器)上,由于在第一次安装后将权限添加到清单文件中,因此未正确授予internet权限。
解决方案:
添加上网权限后重新安装应用,检查错误块中的内容,并确保在拦截器中设置正确的日志级别:
val interceptor = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
val client = OkHttpClient.Builder().apply {
if (BuildConfig.DEBUG) {
addInterceptor(interceptor)
}
}.build()