RxJava Как мне конвертировать Single <T>в Rxjava в Call <T>в Retrofit или наоборот? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть класс обслуживания API с методом, который возвращает Call, предоставленный Retrofit.Недавно Rx2Java представил Single, поэтому я хочу изменить Call на Single, но я не хочу менять логику.Например:
class interface testAPI {

@GET
Call<Object> get()
}

А теперь я хотел бы изменить, как показано ниже

@GET
Single<Object> get()

Есть ли способ конвертировать Single в Call Likes:

Single.fromCall

или

Call.fromSingle

Обновление

@ Мойнхан: Спасибо за ответ!
Я хотел бы описать свою проблемув деталях.

Предыдущая версия прекрасно работает с 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 голосов
/ 14 декабря 2018

В документации Apollo Android есть пример, в котором не используется RxJava, и пример, в котором он используется.Тот, у которого нет API, очень похожего на Retrofit Call.У него есть метод enqueue с обратным вызовом с onSuccess и onFailure.

. Я думаю, что хорошим компромиссом в вашей ситуации было бы начать использование клиента Apollo без RxJava, чтобы ваш код клиента (т.е. код, который в настоящее время зависит и вызывает интерфейс вызова), изменять не нужно.

Позже, когда у вас появятся ресурсы для миграции, вы можете постепенно перенести его в версию RxJava, используя Rx2Apollo обертка.

0 голосов
/ 07 декабря 2018

Да, вы можете .. Вам просто нужно добавить ниже зависимость ..

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>Вызов вы можете создать функцию расширения в 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
}
...