Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Реактивне програмування Kotlin з RxJava та RxKotlin

by
Difficulty:IntermediateLength:LongLanguages:

Ukrainian (українська мова) translation by Nick Nathan (you can also view the original English article)

З моменту отримання офіційної підтримки в якості мови програмування для розробників Android, Kotlin швидко почав набувати популярності. По даним Google кількість додатків, які використовують Kotlin, збільшилася в 6 разів.

Якщо раніше ви користувалися RxJava або RxAndroid, а тепер хочете перейти на Kotlin та реактивне програмування, тоді ця стаття - для вас. Ми торкнемося основ створення RxJava 2.0 ObserversObservables  та потоків даних в Kotlin, перед цим розглянемо, як можна обрізати тонну шаблонного коду ваших проектів, комбінуючи розширені функції RxJava та Kotlin.

Використання RxJava та Kotlin може допомогти вам створити високореактивний додаток з меншою кількістю коду. Оскільки жодна мова програмування не є ідеальною,  я також поділюся з вами проблемами конверсії SAM, з якими зустрічається багато розробників, які вперше використовують RxJava 2.0 з Kotlin.

На завершення, ми створимо додаток, який продемонструє вам, як слід використовувати RxJava для вирішення проблем, з якими ви зустрічаєтесь в реальних проектах Android.

Якщо це ваша перша спроба попрацювати з RxJava, пізніше, в процесі роботи, я також надам вам необхідну інформацію, яка знадобиться вам для розуміння базових концепцій RxJava. Навіть якщо ви досі жодного разу не експериментували з RxJava, під кінець цієї статті у вас буде чітке розуміння, як користуватись бібліотекою у ваших проектах, а також у вас буде декілька готових робочих додатків, створених за допомогою RxJava, RxKotlin, RxAndroid і RxBinding.

І все ж, що таке RxJava?

RxJava - це реалізація бібліотеки ReactiveX з відкритим вихідним кодом, яка допомагає створювати програми шляхом реактивного програмування. Хоча RxJava призначена для обробки синхронних і асинхронних потоків даних, вона не обмежується "традиційними" типами даних. Визначення "даних" в RxJava досить широке і включає кеш, змінні, властивості і навіть події введення даних користувачем (кліки і рухи пальцем). Оскільки ваш додаток не взаємодіє з величезними цифрами або не виконує складні трансформації даних, це не означає, що RxJava не надасть йому переваги!

В якості маленького досвіду використання RxJava для додатків Android можете переглянути декілька з моїх інших постів на Envato Tuts+:

Отже, як працює RxJava?

RxJava розширює паттерн дизайну програмного забезпечення Observer, який базується на концепції Observers та Observables. Щоб створити базовий конвеєр даних RxJava, потрібно:

  • Створити Observable.
  • Надати Observable певні дані.
  • Створити Observer.
  • Підписати Observer на Observable.

Як тільки Observable матиме хоча б одного Observer, він почне видавати дані. Кожного разу, коли Observable надає частину даних, він сповіщує свого Observer, що оформив підписку,  викликаючи метод onNext(), і Observer, зазвичай, виконує певну дію у відповідь на надані дані. Коли Observable завершив видачу даних, він сповістить Observer, викликавши onComplete(). Observable завершиться і потік даних зупиниться.

В якості винятку буде викликано onError() і Observable  буде призупинено негайно без надання будь-якої дати, або ж буде викликано onComplete().

Проте RxJava - це не тільки передача даних від Observable до Observer! RxJava володіє величезною колекцією операторів, які можна використовувати для фільтрування, об'єднання та трансформації даних. Наприклад, уявіть, що ваш додаток має кнопку Pay Now, яка виявляє події onClick, і ви турбуєтесь, що нетерплячий користувач може натискати її декілька разів,  провокуючи додаток здійснити оплату декілька разів.

RxJava дозволяє перетворити ці події onClick в потік даних, яким потім ви зможете маніпулювати за допомогою різноманітних операторів RxJava. В нашому конкретному прикладі ви можете використовувати оператор debounce(), щоб фільтрувати надання даних в швидкій послідовності, тому навіть якщо користувач натискав, і натискав на кнопку Pay Now, ваш додаток зареєструє тільки один платіж.

Які переваги використання RxJava?

Ми побачили, як RxJava може допомогти вам вирішити конкретну проблему в конкретному додатку, але що він може запропонувати проектам Android загалом?

RxJava може допомогти спростити ваш код, надавши певний спосіб його написання для досягнення того, чого ви бажаєте, а не цілий список вказівок, які повинен виконати ваш додаток. Наприклад, якщо ви хочете проігнорувати всі надані дані в період 500 мілісекунд, вам потрібно буде написати:

Помимо того, що RxJava працює практично з усім, що стосується даних, він надає шаблон, який ви можете використовувати для цілого ряду подій: створення Observable, Observer, оформлення підписки Observer на Observable та повтор. Результат такого формулярного підходу - простіший та більш читабельний код.

Іншою основною перевагою для розробників Android є те, що RхJava може взяти на себе проблеми, пов'язані з  багатопотоковим режимом для Android. Сьогодні користувачі мобільних пристроїв очікують від своїх додатків виконання багатьох завдань одночасно, навіть якщо це стосується завантаження даних в фоновому режимі та одночасної підтримки введення даних користувачем.

Android має кілька вбудованих рішень для створення і управління різних ліній, але жоден із них не вирізняється легкою реалізацією. Також для них характерний складний код, в якому вірогідно є багато помилок, та який важко читати.

У RxJava ви створюєте та управляєте додатковими потоками за допомогою комбінації операторів та планувальників. Ви можете легко змінити потік, де роботу вже виконано, за допомогою оператора subscribeOn та планувальника. Наприклад, тут ми плануємо роботу, яка повинна бути виконана на новому потоці.

Ви також можете визначити, де результати цієї роботи повинні бути розміщені за допомогою оператора observeOn. В даному випадку ми розміщуємо результати головного потоку UI за допомогою планувальника AndroidSchedulers.mainThread, який є доступним як частина бібліотеки RxAndroid:

У порівнянні з вбудованими багатопотоковими рішеннями Android, підхід RxJava набагато компактніший і легший для розуміння.

Знову ж таки, ви можете дізнатися більше про роботу RxJava і переваги додання цієї бібліотеки до вашого проекту з моєї статті Get Started With RxJava 2 for Android.

Що мені слід використовувати: RxJava чи RxKotlin?

Оскільки Kotlin 100%-но взаємодіє з Java, ви можете використовувати в проектах Kotlin більшість бібліотек Java без жодних труднощів, і бібліотека RxJava - не є винятком.

Існує спеціальна бібліотека RxKotlin, яка являється обгорткою Kotlin для бібліотеки RxJava. Вона забезпечує розширеннями, які оптимізують RxJava для середовища Kotlin і потім скорочує розмір шаблонного коду, який вам потрібно писати.

Так як ви можете використовувати RxJava в Kotlin без всякої необхідності RxKotlin, протягом всієї статті ми будемо використовувати RxJava, якщо не буде вказано інше.

Створення простих Observers та Observables в Kotlin

Observers та Observable є будівельними блоками RxJava, тому почнемо з їх створення:

  • Простий Observable, що надає короткий потік даних у відповідь на натискання кнопки.
  • Observable, який реагує на ці дані, друкуючи різні повідомлення на Logcat Android Studio. 

Створіть новий проект з налаштуваннями на ваш вибір, але переконаєтесь, що ви поставили галочку в чекбоксі Include Kotlin support. Далі відкрийте ваш файл проекту, build.gradle, та додайте бібліотеку RxJava в якості залежності проекта:

Потім відкрийте файл проекта activity_main.xml і додайте кнопку яка розпочне потік даних:

Є кілька різних способів створення Observable, але найлегший з них - це використання оператора just() для конвертації об'єкта або списку об'єктів в Observable.

В наступному коді ми створюємо Observable (myObservable) та надаємо йому 1, 2, 3, 4, та 5, для випуску. Ми також створюємо Observer (myObserver), підписуючи його на myObservable, а потім вказуємо йому надрукувати повідомлення Logcat  щоразу, коли він отримує нові дані.

Тепер ви можете протестувати цей додаток:

  • Встановіть ваш проект на фізичний смартфон або планшет Android, чи на віртуальний пристрій Android (AVD).
  • Задайте клік для кнопки Start RxJava stream.
  • Відкрийте Android Studio Logcat Monitor, вибравши вкладку Android Monitor (там, де розміщено курсор на скріншоті нижче) і виберіть вкладку Logcat.

На цьому етапі Observable почне випускати свої дані, а Observer друкуватиме свої повідомлення Logcat. Ваш Logcat output повинен виглядати наступним чином:

Check Android Studios Logcat Monitor

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

Розширення Kotlin для RxJava

Тепер, коли ми побачили, як налаштувати простий pipeline RxJava в Kotlin, давайте поглянемо, як ви можете досягти цього з меншим кодом, скориставшись розширеними функціями RxKotlin.

Щоб використовувати бібліотеку RxKotlin, вам потрібно додати наступне в якості залежності проекту:

В наведеному нище прикладі ми використовуємо розширену функцію RxKotlin toObservable(), щоб трансформувати List в Observable. Також використовуємо розширену функцію subscribeBy(), оскільки вона допомагає нам побудувати Observer за допомогою названих аргументів і в результаті ми отримаємо простіший і зрозуміліший код.

Ось output, який ви повинні бачити:

Every time onNext is called the data emission is printed to Android Studios Logcat

Вирішення питання двозначності SAM RxJava 

RxKotlin також надає важливу "заплатку" для питання конверсії SAM, що може виникнути при наявності надто багатьох параметрів SAM для методу Java. Така двозначність SAM може бентежити компілятор Kotlin, оскільки він не може зрозуміти, який інтерфейс йому слід конвертувати, і ваш проект не зможе надати результат.

Така двозначність SAM є особливою проблемою при використанні RxJava 2.0 з Kotlin, оскільки багато операторів RxJava приймають безліч SAM-сумісних типів.

Давайте поглянемо на проблему конверсії SAM на практиці. В наступному коді ми використовуємо оператор zip(), щоб поєднати output двох Observables:

Це приведе до виклику помилки типу інтерфейсу компілятором Kotlin. І все-таки RxKotlin надає допоміжні методи та розширені функції для пошкоджених операторів, включаючи Observables.zip(), які ми використовуємо в наступному коді:

Ось output цього коду:

Switch to the Observableszip operator and the Kotlin compiler will no longer throw a type inference error

Висновок

У цій статті я показав вам, як користуватися бібліотекою RxJava в проектах Kotlin, включаючи ряд додаткових бібліотек, таких як RxKotlin та RxBinding. Ми розглянули, як ви можете використовувати прості Observers та Observables в Kotlin, оптимізацію RxJava для платформи Kotlin за допомогою розширених функцій.

Для цього ми використовували RxJava, щоб створити простий Observables, які надають дані, та Observers, які друкують їх для Android Studio Logcat, але це не те, як ви будете використовувати RxJava реальному житті!

В наступній статті я планую розглянути, як RxJava може допомогти вирішити реальні проблеми, з якими ви зустрічаєтесь при розробці додатків для Android. Ми використаємо RxJava з Kotlin, щоб створити класичний екран реєстрації.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.