Как RxJava2 может вернуть результат из onSuccess в методе, из которого он был вызван? - PullRequest
0 голосов
/ 02 июня 2018
rxjava:2.1.14
rxandroid:2.0.2
Android Studio 3.2 Canary

У меня есть следующий метод, который будет извлекать курсор из отсортированных строк.

Однако этот метод должен вернуть курсор.Однако я не могу вернуть курсор, так как метод onSuccess возвращает void.

Просто интересно, как я могу получить курсор из onSuccess и вернуть его из метода?

public Cursor queryAllInsects(String sortOrder) {
        insectStorageInteractorImp.getAllSortedInsects(sortOrder)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new SingleObserver<Cursor>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                    }

                    @Override
                    public void onSuccess(Cursor cursor) {
                        return cursor; /* anyway I can return the cursor in this method */
                    }

                    @Override
                    public void onError(Throwable e) {
                    }
                });
    }

InsectStorageInteractorImp.kt

override fun getAllSortedInsects(sortOrder: String): Single<Cursor> {
    return Single.fromCallable {
        insectStorageImp.queryAndSort(sortOrder)
    }
}

Большое спасибо за любые предложения,

1 Ответ

0 голосов
/ 02 июня 2018

Вы не можете (ну, технически, вы можете, но это сломало бы смысл использования RxJava и было бы строго хуже, чем просто изменение getAllSortedInsects для возврата Cursor (не считайте это предложениемизменить getAllSortedInsects чтобы вернуть Cursor)).

Но в Kotlin вы можете сделать что-то, что выглядит очень похоже на возвращение Cursor и может использоваться аналогично с сопрограммами:

public suspend fun queryAllInsects(sortOrder: String): Cursor =
    insectStorageInteractorImp.getAllSortedInsects(sortOrder)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .await()

См. https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md для сопрограмм и https://github.com/Kotlin/kotlinx.coroutines/tree/master/reactive/kotlinx-coroutines-rx2 для интеграции с RxJava2.

В качестве альтернативы, вообще не беспокойтесь о RxJava2 и используйте сопрограммы для всей асинхронности.

...