gpt4 book ai didi

kotlin - RxJava 如何将 Rxjava 中的 Single 转换为 Retrofit 中的 Call 或相反的转换

转载 作者:行者123 更新时间:2023-12-02 12:47:29 29 4
gpt4 key购买 nike

我有一个 API 服务类,其方法返回 Retrofit 提供的调用。
最近,Rx2Java 引入了 Single,所以我想将 Call 更改为 Single,但我不想更改逻辑。
例如 :
类接口(interface) 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
}
}

最佳答案

是的你可以..
您只需要添加以下依赖项..

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com