Как я могу сопоставить Observable с Single в RxAndroid?

#android #rx-java2 #rx-android

#Android #rx-java2 #rx-android

Вопрос:

У меня есть Observable<State> state и этот фрагмент кода `

 Flowable<.> loadData(){
return state.toFlowable(Latest).flatmap(this::fetchData()) }`
  

где fetchData() возврат Flowable

но что, если у нас есть fetchData() Single возвращаемый тип, а loadData() возвращает Single<.>

Как я могу сопоставить Observable с Single?

Ответ №1:

Вы можете взять первый элемент .take(1) и преобразовать в single с помощью следующих методов:

  • .single(defaultItem)
  • .singleElement()
  • .singleOrError()

Ответ №2:

Вот рабочее решение:

  loadDataSingle()
            .subscribeBy(
                    onSuccess = { println("This is your single data $it") },
                    onError = { println("We have a problem") }
            )


fun loadDataSingle(): Single<String> {
    return getState().singleOrError()
            .flatMap {
                fetchDataSingle()
            }
}

fun fetchDataSingle(): Single<String> {
    return Single.just("This is fetching your single data")
}
  

Или вы могли бы сделать это Single.fromObservable и обернуть вызов внутри него

    fun loadDataSingle(): Single<String> {
    return Single.fromObservable(getState())
            .flatMap { fetchDataSingle() }

   }

        
  

Комментарии:

1. Если getState() испускается более одного элемента, будет сигнализировано исключение.

2. @lbasek и именно поэтому мы обрабатываем onError его на случай, если это произойдет. Есть ли у вас какое-либо альтернативное решение для этого?

3. Я думаю, это просто вопрос реализации. Вы можете взять только первый элемент ( .take(1) ) и избежать исключения здесь.