RxJava. Прибираємо магію

Я довго боявся використовувати RxJava у production. Її призначення і принцип роботи залишалися для мене загадкою. Читання вихідного коду не додавало ясності, а статті тільки плутали. Під катом спроба відповісти на питання: «Які завдання ця технологія вирішує краще аналогів?» і «Як це працює?» з допомогою аналогій з класичної Java і простих метафор.

image

Читати далі →

Batch loading з Retrofit і RxJava

Доброго часу доби! Працюючи над одним проектом, виявив, що через зв'язку retrofit2 і retrofit2 adapter-rxjava не можна реалізувати batch loading в одному потоці.

Наведу приклад. Маємо опис retrofit-сервісу:

interface Api {
@GET("query.json")
Вами<List<SomeEntityServerView>> getAll(
@Query("first") int first, 
@Query("max") int batchSize);
}

Завантаження одного пакету:

service.getAll(0,20).map(list -> ...).observeOn(...).subscribe(...);

Для завантаження всіх сутностей з сервера, нам доведеться кожного разу створювати новий вами для завантаження чергового пакету. Крім того, як запхнути всі ці observable'и в один потік, представляється вкрай складним.

Для вирішення цієї проблеми, пропоную досить простий підхід.

Читати далі →

Приборкуємо асинхронні процеси в Android з RxJava. Досвід Яндекса

Приборкуємо асинхронні процеси в Android з RxJava
Всім привіт, мене звуть Олексій Агапитов і сьогодні я хочу розповісти, як з
допомогою такої бібліотеки як RxJava можна легко обробляти безліч
асинхронних процесів у вашому Android додатку.
Ми розберемо, як створювати свої холодні і гарячі послідовності, звернемо
увагу на деякі нюанси при використанні RxJava, а також розглянемо
наскільки потужними інструментами є надаються бібліотекою
оператори.
Розповідати про все я буду на прикладі програми Яндекс.Нерухомість і його
головного екрану з картою.
Скріншот
Для початку подивимося на екран і розберемося, що на ньому відбувається, і що нам
належить реалізувати.

Читати далі →

Кілька прикладів практичного використання RxJava

RxJava — це реалізація ReactiveX для Java бібліотеки для асинхронної обробки потоків даних. Патерн вами на стероїдах, як вони самі пишуть. В інтернеті, в тому числі на Хабре, є багато «введень в RxJava». Я хочу привести декілька прикладів реальних завдань. Вони не дуже складні, але можливо хтось побачить якісь подібності зі своїми і задумається.

Власне, завдання:

1. Просте клієнтське TCP-з'єднання. Є протокол поверх TCP/IP, потрібно сформувати повідомлення, підключитися до віддаленого вузла, якщо ще не підключився, передати повідомлення і прочитати відповідь. Плюс обробка помилок, перевірка таймаутів, повтор відправки в разі невдачі. Жорстких вимог до продуктивності ні, трафік не великий.

2. Є двигун і деякий датчик. Потрібно провести сканування — пройтися двигуном по заданій траєкторії: послати двигун до точки, дочекатися, коли він до неї приїде, зняти показання датчика, відобразити точку на графіку (GUI потоці), поїхати до наступної точки…

3. Отримані після сканування дані потрібно обробити (умовно тривалий обчислювальний процес) і засунути в pdf-звіт (умовно тривалий процес вводу-виводу) разом із зображенням графіка і даними введеними користувачем (GUI потік).

Читати далі →

Чому слід використовувати RxJava в Android – короткий вступ в RxJava

Здравствуйте все.

Ми продовжуємо знайомити вас з нашим видавничим пошуком, і хотіли прозондувати громадська думка на тему RxJava.



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

Читати далі →

Чому слід використовувати RxJava в Android – короткий вступ в RxJava

Здравствуйте все.

Ми продовжуємо знайомити вас з нашим видавничим пошуком, і хотіли прозондувати громадська думка на тему RxJava.



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

Читати далі →

Основи реактивного програмування під Android на практичному прикладі

1. Введення в реактивне програмування

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

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

RxJava — реалізація ReactiveX з відкритим вихідним кодом на Java. Базовими будівельними блоками реактивного коду є Observables і Subscribers. Детальніше з базовою основою можна ознайомитися в статті Грокаем* RxJava, частина перша: основи.

RxAndroid — розширення до RxJava, яке дозволяє планувальником запускати код в основному і додаткових потоках Android програми і забезпечує передачу результатів створених додаткових потоках в основне для агрегації та взаємодії з інтерфейсом користувача.
З метою більш повного розуміння основних принципів реактивного програмування розглянемо практичний приклад для платформи Android. І почнемо з налаштування оточення для розробки.

Читати далі →

Використовуємо RxJava і Retrofit на Android, враховуючи поворот екрану

я Вирішив одного разу таки спробувати дико популярний нині Rx. А заодно і Retrofit. І подивитися, як з їх допомогою реалізувати стандартну задачу: отримати з сервера набір даних, переглянути їх і при цьому нічого не втрачати при поворотах екрану і не робити зайвих запитів. Перший варіант у мене вийшов майже відразу — просто взяв і викликав cache() на Вами, одержуваний з сінглтона, але він мене не влаштовував — для примусового оновлення доводилося, з якоїсь причини, перестворювати екземпляри класів Retrofit і його реалізації мого інтерфейсу API. Нарощування ж самого Вами ефекту не давало — завжди поверталися старі дані замість запуску нового мережевого запиту і отримання нових даних.
Після довгих мук з новою для себе технологією з'ясував, що в усьому був винен cache() (точніше, мабуть, моє неправильне його розуміння). В підсумку зробив так: фрагмент запускає метод, який підписує Subscriber сінглтона на Вами retrofit-a, коий запускає onNext і onError BehaviorSubject-a, на який підписується вже Subscriber фрагмента. Код на GitHub тут, подробиці під катом.
Читати далі →

HolyJS: з першої спроби

Петербурзька JavaScript-конференція HolyJS починалася майже як авантюра. Затівати абсолютно нову конференцію, коли час на підготовку дуже обмежено — сміливе рішення.

Такий авантюризм добре відповідає духу самого JavaScript-світу, де все відбувається стрімко, а сміливі рішення найчастіше необхідні. Але чи можливо в такому випадку провести конференцію на високому рівні, з цікавими доповідями і без організаційних проблем? Що в підсумку було на заході? Під катом — розповідь про те, як воно пройшло.




Читати далі →

Введення в RxJava: Життєвий цикл підписки

image
Одна з головних ідей, що лежать в основі Rx, полягає в тому, що невідомо коли саме послідовність видасть нове значення або завершиться. Однак, у нас є можливість керувати часом в яке ми почнемо або закінчимо отримувати ці значення. До того ж, якщо наші передплатники використовують зовнішні ресурси, то ми, ймовірно захочемо звільнити їх по закінченні певної послідовності.

Читати далі →