我有一个API服务类,该类具有返回Retrofit提供的Call的方法。
最近,Rx2Java引入了Single,因此我想将Call更改为Single,但是我不想更改逻辑。
例如:
类接口testAPI {
@GET
Call<Object> get()
}
现在我想像下面一样更改
@GET
Single<Object> get()
反正有将Single转换为Call likes:
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
}
}
答案 0 :(得分:1)
是的你可以.. 您只需要添加以下依赖项即可。
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()
要从“呼叫”>“单个”或“签名”>“呼叫”进行转换,您可以在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
}
答案 1 :(得分:0)
在Apollo Android docs中,有一个示例不使用RxJava,而确实使用RxJava。一个不具有与翻新调用非常相似的API的API。它有一个enqueue
方法,并带有一个onSuccess
和onFailure
的回调。
我认为您情况的一个很好的折衷办法是开始使用没有RxJava的Apollo客户端,这样您的客户端代码(即当前依赖并调用Call接口的代码)就不必更改。
稍后,当您拥有迁移资源时,可以使用Rx2Apollo
包装器将其逐步迁移到RxJava版本。