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

Обсуждение статей из раздела Блог
Ответить
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 13 июл 2017, 22:12

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


Click here to read this article!
Последний раз редактировалось damager82 28 май 2018, 12:09, всего редактировалось 11 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
getmejiayu
Сообщения: 3
Зарегистрирован: 02 авг 2017, 13:41
Контактная информация:

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

Сообщение getmejiayu » 02 авг 2017, 13:44

Отличный материал. Спасибо :mrgreen:

danek130995
Сообщения: 42
Зарегистрирован: 25 янв 2015, 18:57

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

Сообщение danek130995 » 04 авг 2017, 01:13

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);
}
:)

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 13 авг 2017, 20:45

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 согласен принять функцию, которую он потом сам может выполнить в указанном шедулере и получить значение. Получается что-то типа отложенного вызова.

Как-то так)
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

CocoNut
Сообщения: 2
Зарегистрирован: 31 янв 2018, 12:23

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

Сообщение CocoNut » 13 мар 2018, 23:08

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


Ответить