Как упоминалось в моем предыдущем блоге, RxJava упрощает многопоточность. Позвольте мне поделиться еще одним преимуществом RxJava - подключение к сетям стало намного проще.
Ниже приведены 3 сценария.
1. Сетевой вызов, зависящий от другого: flatMap
Существуют различные случаи, когда вам необходимо иметь такую цепочку, как показано на диаграмме. Например, получение сайта по URL-адресу, затем использование URL-адреса для выполнения другой выборки, затем получение токена доступа и предоставление его для второй сетевой выборки и т. Д.
Мы могли бы использовать вызов оператора flatMap
val disposable = firstNetworkCall() .flatMap{ secondNetworkCall(it) } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { it -> doSomethingWithResonse($it) }
2. Подключите сетевые вызовы к одному и тому же наблюдателю: mergeWith
Предположим, мы получаем данные из двух сетей, которые не зависят друг от друга, но хотели бы передать результат одному и тому же наблюдателю.
Мы могли бы использовать вызов оператора mergeWith
val disposable = firstNetworkCall() .mergeWith(secondNetworkCall()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { it -> doSomethingWithIndividualResponse($it) }
При этом будут наблюдаться данные из firstNetworkCall
, а затем будут наблюдаться secondNetworkCall
данные. Оба наблюдаются одним и тем же наблюдателем.
3. Объедините результаты сетевых вызовов вместе: zipWith
Иногда вместо того, чтобы отправлять наблюдателю индивидуальный результат, мы хотим объединить их перед отправкой. Это было бы очень полезно, когда нам не нужно беспокоиться об ожидании и синхронизации на стороне наблюдателя.
Мы могли бы добиться этого, используя zipWith
val disposable = firstNetworkCall() .zipWith(secondNetworkCall(), BiFunction{ firstResonse: ResponseOneType, secondResponse: ResponseTwoType -> combineResult(firstResponse, secondResponse) }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { it -> doSomethingWithCombinedResponse($it) }
Очень похоже на mergeWith
, функция zipWith
также принимает ссылку на первую наблюдаемую и вторую наблюдаемую. После подписки он сначала получает firstResponse
, а затем secondResponse
. После этого BiFunction
используется для сбора обоих результатов, а затем вы можете объединить результат (например, функцию combineResult
) перед передачей его в Observer.
Хорошо, но еще не идеально…
С flatMap
, mergeWith
и zipWith
мы теперь могли легко связывать сетевые вызовы перед отправкой в функцию наблюдателя, которая их использует.
Отлично. Но есть один недостаток - они по-прежнему выполняются последовательно. Например. если firstNetworkCall
занимает 5 секунд, а secondNetworkCall
- 5 секунд, то общий процесс до достижения Наблюдателя составляет 10 секунд.
Для сценария 1 это имеет смысл, поскольку один зависит от других. Но для сценария 2 и 3 оба сетевого вызова должны выполняться параллельно.
Посмотрите ниже, чтобы узнать, как заставить их работать параллельно:
Надеюсь, этот пост будет вам полезен. Вы можете ознакомиться с другими моими интересными темами здесь.
Следуйте за мной в medium, Twitter, Facebook или Reddit за небольшими советами и изучение Android, Kotlin и т. д., связанные темы. ~ Эли ~