Страница 1 из 1

Как сделать метод асинхронным с помощью RxJava

Добавлено: 13 июл 2017, 22:12
damager82
Иногда я в чужом коде встречаю использование just, чтобы вызвать какой-либо метод, используя RxJava. В этом посте я хотел бы рассказать, почему не стоит так делать, и показать правильный вариант реализации.


Click here to read this article!

Re: Как сделать метод асинхронным с помощью RxJava

Добавлено: 02 авг 2017, 13:44
getmejiayu
Отличный материал. Спасибо :mrgreen:

Re: Как сделать метод асинхронным с помощью RxJava

Добавлено: 04 авг 2017, 01:13
danek130995
damager82 писал(а):Иногда я в чужом коде встречаю использование just, чтобы вызвать какой-либо метод, используя RxJava. В этом посте я хотел бы рассказать, почему не стоит так делать, и показать правильный вариант реализации.


Click here to read this article!
Скажите пожалуйста, а почему все-таки just не выполняется в щедулере, который мы указываем в subscribeOn()? Просто я думал, что независимо от того, где находится subscribeOn, все начинает выполняться в другом потоке (RxIoScheduler-2 в данном случае)

P.S. хорошо бы указать в данном посте, что fromCallable() внутри себя использует try/catch, чтобы было понятнее, почему именно нет проблемы при использовании его, а не just, т.е. вот примерная реализация его:
try {
subscriber.onNext(longAction("5"));
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
:)

Re: Как сделать метод асинхронным с помощью RxJava

Добавлено: 13 авг 2017, 20:45
damager82
danek130995 писал(а):
damager82 писал(а):Иногда я в чужом коде встречаю использование just, чтобы вызвать какой-либо метод, используя RxJava. В этом посте я хотел бы рассказать, почему не стоит так делать, и показать правильный вариант реализации.


Click here to read this article!
Скажите пожалуйста, а почему все-таки just не выполняется в щедулере, который мы указываем в subscribeOn()? Просто я думал, что независимо от того, где находится subscribeOn, все начинает выполняться в другом потоке (RxIoScheduler-2 в данном случае)

P.S. хорошо бы указать в данном посте, что fromCallable() внутри себя использует try/catch, чтобы было понятнее, почему именно нет проблемы при использовании его, а не just, т.е. вот примерная реализация его:
try {
subscriber.onNext(longAction("5"));
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
:)
Мы при создании Observable явно вызываем метод Observable.just в UI потоке. И если мы передаем туда не значение, а метод, то этот метод должен будет выполниться сразу же, чтобы получить значение, передать его в just и продолжить идти по цепочке методов создания Observable. Т.е. то, что внутри just - выполняется при создании Observable. Потому что Observable нужно сразу знать значение.

А при fromCallable у нас получается что-то типа функционального программирования. Мы передаем в Observable функцию. И эта функция будет вызвана уже где то внутри Observable при старте. Т.е. нет необходимости вызывать Callable при создании Observable, чтобы получить значение. Observable согласен принять функцию, которую он потом сам может выполнить в указанном шедулере и получить значение. Получается что-то типа отложенного вызова.

Как-то так)

Re: Как сделать метод асинхронным с помощью RxJava

Добавлено: 13 мар 2018, 23:08
CocoNut
Здравствуйте.
В зависимостях у Вас указана 2-я версия Rx, а в примере используется Action1 вместо Consumer. Это просто опечатка?)