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

标签 kotlin retrofit rx-java rx-java2 rx-android

我有一个 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/

相关文章:

android - 改造和 HTTP 补丁

java.lang.UnsatisfiedLinkError : org. opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J

android - 预览Camera with Kotlin实景应该选择哪个view?

android - Android 中的改造响应

android - 使用 Retrofit 动态填充微调器?

java - 如果 RxJava 中结果无效,如何发送 onError

android - rxJava,定期刷新 api 数据

android - java.lang.NoSuchFieldError : No field Companion of type Landroidx/compose/foundation/layout/BoxScope$Companion;

java - 在为电子邮件 Intent 选择应用程序时,我的应用程序显示为一个选项

没有实例的 Java 枚举