RxJava如何将Rxjava中的Single <t>转换为翻新中的Call <t>或相反的转换

时间:2018-12-07 03:37:04

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

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

2 个答案:

答案 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方法,并带有一个onSuccessonFailure的回调。

我认为您情况的一个很好的折衷办法是开始使用没有RxJava的Apollo客户端,这样您的客户端代码(即当前依赖并调用Call接口的代码)就不必更改。

稍后,当您拥有迁移资源时,可以使用Rx2Apollo包装器将其逐步迁移到RxJava版本。