Настройте ObservableTransformer с помощью RxJav / RxKotlin2 при использовании с compose () - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь написать функцию преобразования, которая используется с compose() для уменьшения стандартного кода.Это довольно просто, как это:

    fun <R> withSchedulers(): ObservableTransformer<R, R> {
        return ObservableTransformer {
            it.subscribeOn(Schedulers.io())
              .observeOn(AndroidSchedulers.mainThread())
        }
    }

Так что каждый раз, когда я хочу подписаться на что-либо на ioThread и прослушать результат на mainThread, это всего лишь несколько строк кода:

    Observable.just(1)
        .compose(MyUtilClass.withSchedulers())
        .subscribe()

Но не только Observable, но у нас также есть Single, Completable, Maybe и Flowable.Поэтому каждый раз, когда я хочу объединить их с моей withSchedulers() функцией, я должен преобразовать ее в новый тип (чего я не ожидаю).

Например,

Completable.fromAction { 
        Log.d("nhp", "hello world")
    }//.compose(MyUtilClass.withSchedulers()) <-- This is not compiled
            .toObservable() <--- I have to transform it into Observable
            .compose(MyUtilClass.withSchedulers())
            .subscribe()

Итак, мой вопрос, есть ли способ написать вышеуказанную функцию для использования с compose() для любого вида Observable (Single,Completable, ...)?Или мы должны написать различные функции, которые используют ObservableTransformer, SingleTransformer, ....?

1 Ответ

0 голосов
/ 04 января 2019

Я создал вспомогательный метод, используя reified тип:

inline fun <reified T> withSchedulers(): T {
    when (T::class) {
        ObservableTransformer::class  -> return ObservableTransformer<Unit, Unit> {
            it.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
        } as T
        SingleTransformer::class      -> return SingleTransformer<Unit, Unit> {
            it.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
        } as T
        CompletableTransformer::class -> return CompletableTransformer {
            it.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
        } as T
    }
    throw IllegalArgumentException("not a valid Transformer type")
}

Примеры:

    Observable.just("1", "2")
            .compose(withSchedulers<ObservableTransformer<String, String>>())
            .subscribe(System.out::println)

    Single.just(3)
            .compose(withSchedulers<SingleTransformer<Int, Int>>())
            .subscribe(Consumer { println(it) })

    Completable.defer { Completable.complete()  }
            .compose(withSchedulers<CompletableTransformer>())
            .subscribe { println("completed") }

Вывод:

1
2
3
completed

Возможно другие способы выполненияэто, но это пришло в голову.

...