我有一个 API 服务类,其方法返回由 Retrofit 提供的 Call。
最近,Rx2Java引入了Single,所以我想将Call更改为Single,但我不想更改逻辑。
例如:
类接口(interface)testAPI{
@GET
Call<Object> get()
}
现在我想进行如下更改
@GET
Single<Object> get()
是否有办法将 Single 转换为 Call 喜欢:
Single.fromCall
或
Call.fromSingle
更新
@Moinkhan:谢谢您的回复!
我想详细描述一下我的问题。
以前版本的应用程序可以与 Rest API 和 Retrofit 配合使用,运行良好
@GET
Call<Response> get()
现在,我们计划使用 GraphQL + Apollo 客户端 Android。 Apollo客户端兼容Rxjava。 API 如下所示:
class apolloApi {
fun get(): Single<Response> {
// Run query code with Apollo Query and Rx2Java
}
}
如果我们这样做,我们就必须改变以前的所有逻辑。这需要我们的努力。 (当然,我们将来一定要做!)
但现在,如果我们能将 Single 转换为 Call,那就没问题了!
例如:
class apolloApi {
private fun get(): Single<Response> {
// Run query code with Apollo Query and Rx2Java
}
fun convertCall(): Call<Response> {
return get().toCall() // Something like that
}
}
最佳答案
是的,你可以.. 您只需要添加以下依赖项..
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
在您的改造客户端中..
retrofit = Retrofit.Builder()
.client(client)
.baseUrl(baseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // this line is important
.addConverterFactory(GsonConverterFactory.create())
.build()
对于从 Call > Single 或 Signle > Call 进行转换,您可以在 kotlin 中创建扩展函数。
从通话到单例
fun <T> Call<T>.toSingle(): Single<Response<T>> {
val single = SingleSubject.create<Response<T>>()
this.enqueue(object : Callback<T> {
override fun onFailure(call: Call<T>, t: Throwable) {
single.onError(t)
}
override fun onResponse(call: Call<T>, response: Response<T>) {
single.onSuccess(response)
}
})
return single
}
关于kotlin - RxJava 如何将 Rxjava 中的 Single<T> 转换为 Retrofit 中的 Call<T> 或相反转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662858/