Реактивный двигатель для вашего android-приложения —...
TRANSCRIPT
![Page 1: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/1.jpg)
Реактивный двигатель вашего Android приложения
Матвей Мальков
![Page 2: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/2.jpg)
Обо мне
![Page 3: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/3.jpg)
3Обо мне
![Page 4: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/4.jpg)
О чем доклад
![Page 5: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/5.jpg)
5
![Page 6: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/6.jpg)
• практика
6О чем доклад
![Page 7: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/7.jpg)
• практика
• проблемы
7О чем доклад
![Page 8: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/8.jpg)
• практика
• проблемы
• решения
8О чем доклад
![Page 9: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/9.jpg)
• практика
• проблемы
• решения
• android + RxJava
9О чем доклад
![Page 10: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/10.jpg)
Сейчас
![Page 11: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/11.jpg)
11
User Interface
![Page 12: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/12.jpg)
12
User Interface
TextView
EditText
EditText
Button Button
![Page 13: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/13.jpg)
13
User Interface
TextView
EditText
EditText
Button Button
State
![Page 14: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/14.jpg)
14
Data
![Page 15: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/15.jpg)
15
Data
API
CacheDevice
DB
![Page 16: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/16.jpg)
16
Data
State
API
CacheDevice
DB
![Page 17: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/17.jpg)
17
Состояние системы
![Page 18: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/18.jpg)
• мутабельно
18Состояние системы
![Page 19: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/19.jpg)
• мутабельно
• обновляется через callback
19Состояние системы
![Page 20: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/20.jpg)
• мутабельно
• обновляется через callback
• плохо композируется
20Состояние системы
![Page 21: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/21.jpg)
• мутабельно
• обновляется через callback
• плохо композируется
• явное
21Состояние системы
![Page 22: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/22.jpg)
Мутабельность
![Page 23: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/23.jpg)
23
User user = new User("Jake Mobius"); /** * 100 качественных строчек кода */final String name = user.getName(); //этот assert легко может упастьassert("Jake Mobius".equals(name));
![Page 24: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/24.jpg)
24// какой-то тред User user = new User("Jake Mobius"); fetchInfo(user); final String name = user.getName(); //этот assert легко может упастьassert("Jake Mobius".equals(name));
![Page 25: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/25.jpg)
25// какой-то тред User user = new User("Jake Mobius"); fetchInfo(user); final String name = user.getName(); //этот assert легко может упастьassert("Jake Mobius".equals(name));
// в это же время// другой какой-то тредuser.setName("Jake Popik");
![Page 26: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/26.jpg)
Обновляемость через callback
![Page 27: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/27.jpg)
27
![Page 28: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/28.jpg)
28
![Page 29: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/29.jpg)
29nameEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { requestDuplicates(editable.toString(), new MyCallback() { @Override public void onResponse(Response response){ checkResponseForDuplicates(response, new MyCallback() { @Override public void onResponse(Response response) { setHasDuplicates(calcDuplicates(response)); } }); } }); } });
![Page 30: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/30.jpg)
30nameEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { requestDuplicates(editable.toString(), new MyCallback() { @Override public void onResponse(Response response){ checkResponseForDuplicates(response, new MyCallback() { @Override public void onResponse(Response response) { setHasDuplicates(calcDuplicates(response)); } }); } }); } });
![Page 31: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/31.jpg)
31nameEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { requestDuplicates(editable.toString(), new MyCallback() { @Override public void onResponse(Response response){ checkResponseForDuplicates(response, new MyCallback() { @Override public void onResponse(Response response) { setHasDuplicates(calcDuplicates(response)); } }); } }); } });
![Page 32: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/32.jpg)
32nameEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { requestDuplicates(editable.toString(), new MyCallback() { @Override public void onResponse(Response response){ checkResponseForDuplicates(response, new MyCallback() { @Override public void onResponse(Response response) { setHasDuplicates(calcDuplicates(response)); } }); } }); } });
![Page 33: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/33.jpg)
Плохая композируемость
![Page 34: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/34.jpg)
34
![Page 35: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/35.jpg)
35
passEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { lastPassText = editable.toString(); checkEqualityToEnableButton(); } }); confirmEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { lastConfirmText = editable.toString(); checkEqualityToEnableButton(); } });
![Page 36: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/36.jpg)
36
passEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { lastPassText = editable.toString(); checkEqualityToEnableButton(); } }); confirmEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { lastConfirmText = editable.toString(); checkEqualityToEnableButton(); } });
![Page 37: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/37.jpg)
37
![Page 38: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/38.jpg)
38nameEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { lastIsNameEmpty = editable.toString().length() == 0; requestDuplicates(editable.toString(), new MyCallback() { @Override public void onResponse(Response response){ checkResponseForDuplicates(response, new MyCallback() { @Override public void onResponse(Response response) { lastIsHasDuplicates = calcDuplicates(response); setHasDuplicates(lastIsHasDuplicates); checkEqualityToEnableButton(); } }); } }); } });
![Page 39: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/39.jpg)
39nameEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { lastIsNameEmpty = editable.toString().length() == 0; requestDuplicates(editable.toString(), new MyCallback() { @Override public void onResponse(Response response){ checkResponseForDuplicates(response, new MyCallback() { @Override public void onResponse(Response response) { lastIsHasDuplicates = calcDuplicates(response); setHasDuplicates(lastIsHasDuplicates); checkEqualityToEnableButton(); } }); } }); } });
![Page 40: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/40.jpg)
40nameEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { lastIsNameEmpty = editable.toString().length() == 0; requestDuplicates(editable.toString(), new MyCallback() { @Override public void onResponse(Response response){ checkResponseForDuplicates(response, new MyCallback() { @Override public void onResponse(Response response) { lastIsHasDuplicates = calcDuplicates(response); setHasDuplicates(lastIsHasDuplicates); checkEqualityToEnableButton(); } }); } }); } });
![Page 41: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/41.jpg)
41nameEditText.addTextChangedListener(new Watcher() { @Override public void afterTextChanged(Editable editable) { lastIsNameEmpty = editable.toString().length() == 0; requestDuplicates(editable.toString(), new MyCallback() { @Override public void onResponse(Response response){ checkResponseForDuplicates(response, new MyCallback() { @Override public void onResponse(Response response) { lastIsHasDuplicates = calcDuplicates(response); setHasDuplicates(lastIsHasDuplicates); checkEqualityToEnableButton(); } }); } }); } });
![Page 42: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/42.jpg)
Явное состояние
![Page 43: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/43.jpg)
43
private String lastPassText; private String lastConfirmText; private boolean lastIsHasDuplicates; private boolean lastIsNameEmpty;
![Page 44: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/44.jpg)
44
lastPassText = editable.toString().trim();
![Page 45: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/45.jpg)
45
lastPassText = editable.toString().trim();
![Page 46: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/46.jpg)
46
lastPassText = editable.toString().trim();
![Page 47: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/47.jpg)
47
private String lastPassText; private String lastConfirmText; private boolean lastIsHasDuplicates; private boolean lastIsNameEmpty; private String lastPassTrimmedString;
![Page 48: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/48.jpg)
“Все может быть лучше”
![Page 49: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/49.jpg)
“Пора стать реактивней”
![Page 50: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/50.jpg)
50Потоки данных
t
Данные Ошибка Конец
![Page 51: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/51.jpg)
51
t
![Page 52: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/52.jpg)
52
M
Mt
![Page 53: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/53.jpg)
53
Mo
M Mot
![Page 54: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/54.jpg)
54
Mob
M Mo Mobt
![Page 55: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/55.jpg)
55
Mobi
M Mo Mob Mobit
![Page 56: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/56.jpg)
56
Mobiu
MobiuM Mo Mob Mobit
![Page 57: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/57.jpg)
57
Mobius
MobiuM Mo Mob Mobi Mobiust
![Page 58: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/58.jpg)
• изолируют состояние
58Потоки данных
![Page 59: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/59.jpg)
• изолируют состояние
• прошлое
59Потоки данных
![Page 60: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/60.jpg)
• изолируют состояние
• прошлое
• настоящее
60Потоки данных
![Page 61: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/61.jpg)
• изолируют состояние
• прошлое
• настоящее
• будущее
61Потоки данных
![Page 62: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/62.jpg)
• изолируют состояние
• прошлое
• настоящее
• будущее
• неизменяемые
62Потоки данных
![Page 63: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/63.jpg)
• изолируют состояние
• прошлое
• настоящее
• будущее
• неизменяемые
• строго типизированные
63Потоки данных
![Page 64: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/64.jpg)
• EditTextObservable
64Что может быть потоком?
![Page 65: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/65.jpg)
• EditTextObservable
• ApiDataObservable
65Что может быть потоком?
![Page 66: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/66.jpg)
• EditTextObservable
• ApiDataObservable
• TouchObservable
66Что может быть потоком?
![Page 67: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/67.jpg)
• EditTextObservable
• ApiDataObservable
• TouchObservable
• Все, что захотите
67Что может быть потоком?
![Page 68: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/68.jpg)
RxJava
![Page 69: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/69.jpg)
• reactive streams для java
69RxJava
![Page 70: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/70.jpg)
• reactive streams для java
• open source
• by Netflix
70RxJava
![Page 71: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/71.jpg)
• reactive streams для java
• open source
• by Netflix
• стабильная
71RxJava
![Page 72: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/72.jpg)
• reactive streams для java
• open source
• by Netflix
• стабильная
• почти
72RxJava
![Page 73: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/73.jpg)
Observable
![Page 74: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/74.jpg)
74Потоки данных
t
Данные Ошибка Конец
![Page 75: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/75.jpg)
• создать
75Observable можно
![Page 76: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/76.jpg)
• создать
• изменить
76Observable можно
![Page 77: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/77.jpg)
• создать
• изменить
• получить значения
77Observable можно
![Page 78: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/78.jpg)
78Создание
7
Observable<Integer> just = Observable.just(7);
t
![Page 79: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/79.jpg)
79Создание
6541 2 3 7
Observable<Integer> many = Observable .from(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
t
![Page 80: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/80.jpg)
80СозданиеObservable.create(subscriber -> { final List<Data> list = requestNewData(); for (final Data data : list) { subscriber.onNext(data); } subscriber.onCompleted(); });
![Page 81: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/81.jpg)
81СозданиеObservable.create(subscriber -> { final List<Data> list = requestNewData(); for (final Data data : list) { subscriber.onNext(data); } subscriber.onCompleted(); });
![Page 82: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/82.jpg)
82СозданиеObservable.create(subscriber -> { final List<Data> list = requestNewData(); for (final Data data : list) { subscriber.onNext(data); } subscriber.onCompleted(); });
![Page 83: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/83.jpg)
83СозданиеObservable.create(subscriber -> { final List<Data> list = requestNewData(); for (final Data data : list) { subscriber.onNext(data); } subscriber.onCompleted(); });
![Page 84: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/84.jpg)
84Подписка
t
![Page 85: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/85.jpg)
85Подписка
Кто-то №1
t
![Page 86: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/86.jpg)
86Подписка
Кто-то №1
Mt
M
![Page 87: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/87.jpg)
87Подписка
Кто-то №2
Mt
Кто-то №1
M
![Page 88: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/88.jpg)
88Подписка
Кто-то №2
M Mot
Mo
Кто-то №1
![Page 89: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/89.jpg)
89Подписка
Кто-то №2
M Mo Mobt
Mob
Кто-то №1
![Page 90: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/90.jpg)
90
![Page 91: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/91.jpg)
91
Observable<String> nameObs = EditTextObservable.from(nameEditText); Subscription nameSubs = nameObs .doOnNext(name -> { Log.i(TAG, "new user name : " + name); }) .subscribe(name -> { signUpTitle.setText("Sign up, " + name); });
![Page 92: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/92.jpg)
92
Observable<String> nameObs = EditTextObservable.from(nameEditText); Subscription nameSubs = nameObs .doOnNext(name -> { Log.i(TAG, "new user name : " + name); }) .subscribe(name -> { signUpTitle.setText("Sign up, " + name); });
![Page 93: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/93.jpg)
93
Observable<String> nameObs = EditTextObservable.from(nameEditText); Subscription nameSubs = nameObs .doOnNext(name -> { Log.i(TAG, "new user name : " + name); }) .subscribe(name -> { signUpTitle.setText("Sign up, " + name); });
![Page 94: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/94.jpg)
94
// когда больше не надо слушать этот EditTextnameSubs.unsubscribe();
Observable<String> nameObs = EditTextObservable.from(nameEditText); Subscription nameSubs = nameObs .doOnNext(name -> { Log.i(TAG, "new user name : " + name); }) .subscribe(name -> { signUpTitle.setText("Sign up, " + name); });
![Page 95: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/95.jpg)
95
![Page 96: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/96.jpg)
Операторы
![Page 97: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/97.jpg)
• возвращают новый Observable
97Операторы
![Page 98: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/98.jpg)
• возвращают новый Observable
• применяются ко всему потоку
98Операторы
![Page 99: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/99.jpg)
Основы : map и flatMap
![Page 100: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/100.jpg)
100
![Page 101: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/101.jpg)
![Page 102: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/102.jpg)
102
Observable<String> nameObs = EditTextObservable .from(nameEditText);nameObs.subscribe(name -> requestDuplicates(name));Observable<String> rightTitleObservable = nameObs .map(name -> { if (TextUtils.isEmpty(name)) return name; else return ", " + name; });rightTitleObservable.subscribe(name -> signUpTitle.setText("Sign up" + name));
![Page 103: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/103.jpg)
103
Observable<String> nameObs = EditTextObservable .from(nameEditText);nameObs.subscribe(name -> requestDuplicates(name));Observable<String> rightTitleObservable = nameObs .map(name -> { if (TextUtils.isEmpty(name)) return name; else return ", " + name; });rightTitleObservable.subscribe(name -> signUpTitle.setText("Sign up" + name));
![Page 104: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/104.jpg)
104
Observable<String> nameObs = EditTextObservable .from(nameEditText);nameObs.subscribe(name -> requestDuplicates(name));Observable<String> rightTitleObservable = nameObs .map(name -> { if (TextUtils.isEmpty(name)) return name; else return ", " + name; });rightTitleObservable.subscribe(name -> signUpTitle.setText("Sign up" + name));
![Page 105: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/105.jpg)
105
Observable<String> nameObs = EditTextObservable .from(nameEditText);nameObs.subscribe(name -> requestDuplicates(name));Observable<String> rightTitleObservable = nameObs .map(name -> { if (TextUtils.isEmpty(name)) return name; else return ", " + name; });rightTitleObservable.subscribe(name -> signUpTitle.setText("Sign up" + name));
![Page 106: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/106.jpg)
106
Observable<String> nameObs = EditTextObservable .from(nameEditText);nameObs.subscribe(name -> requestDuplicates(name));Observable<String> rightTitleObservable = nameObs .map(name -> { if (TextUtils.isEmpty(name)) return name; else return ", " + name; });rightTitleObservable.subscribe(name -> signUpTitle.setText("Sign up" + name));
![Page 107: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/107.jpg)
107
Observable<String> nameObs = EditTextObservable .from(nameEditText);nameObs.subscribe(name -> requestDuplicates(name));Observable<String> rightTitleObservable = nameObs .map(name -> { if (TextUtils.isEmpty(name)) return name; else return ", " + name; });rightTitleObservable.subscribe(name -> signUpTitle.setText("Sign up" + name));
![Page 108: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/108.jpg)
108
![Page 109: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/109.jpg)
109
![Page 110: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/110.jpg)
110DebounceObservable<String> nameObs = EditTextObservable .from(nameEditText); Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .onErrorReturn(throwable -> false); duplicatesCheckObservable.subscribe(isUnique -> { /*process*/ });
![Page 111: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/111.jpg)
111DebounceObservable<String> nameObs = EditTextObservable .from(nameEditText); Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .onErrorReturn(throwable -> false); duplicatesCheckObservable.subscribe(isUnique -> { /*process*/ });
![Page 112: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/112.jpg)
112DebounceObservable<String> nameObs = EditTextObservable .from(nameEditText); Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .onErrorReturn(throwable -> false); duplicatesCheckObservable.subscribe(isUnique -> { /*process*/ });
![Page 113: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/113.jpg)
113DebounceObservable<String> nameObs = EditTextObservable .from(nameEditText); Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .onErrorReturn(throwable -> false); duplicatesCheckObservable.subscribe(isUnique -> { /*process*/ });
![Page 114: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/114.jpg)
• выполняется когда надо
114Наше решение
![Page 115: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/115.jpg)
• выполняется когда надо
• экономит траффик
115Наше решение
![Page 116: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/116.jpg)
• выполняется когда надо
• экономит траффик
• не нагружает сервер
116Наше решение
![Page 117: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/117.jpg)
• выполняется когда надо
• экономит траффик
• не нагружает сервер
• без callback hell
117Наше решение
![Page 118: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/118.jpg)
• выполняется когда надо
• экономит траффик
• не нагружает сервер
• без callback hell
• легко обрабатывает ошибки
118Наше решение
![Page 119: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/119.jpg)
119
![Page 120: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/120.jpg)
Прочие полезности
![Page 121: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/121.jpg)
• debounce
121Полезности
![Page 122: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/122.jpg)
• debounce
• cache
122Полезности
![Page 123: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/123.jpg)
• debounce
• cache
• timeout
123Полезности
![Page 124: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/124.jpg)
• debounce
• cache
• timeout
• first
124Полезности
![Page 125: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/125.jpg)
• debounce
• cache
• timeout
• first
• distinct
125Полезности
![Page 126: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/126.jpg)
• debounce
• cache
• timeout
• first
• distinct
• skipLast
126Полезности
![Page 127: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/127.jpg)
• debounce
• cache
• timeout
• first
• distinct
• skipLast
• reduce
127Полезности
![Page 128: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/128.jpg)
• debounce
• cache
• timeout
• first
• distinct
• skipLast
• reduce
• cast
128Полезности
![Page 129: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/129.jpg)
• debounce
• cache
• timeout
• first
• distinct
• skipLast
• reduce
• cast
• averageDouble
129Полезности
![Page 130: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/130.jpg)
• debounce
• cache
• timeout
• first
• distinct
• skipLast
• reduce
• cast
• averageDouble
• takeWhile
130Полезности
![Page 131: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/131.jpg)
Комбинирование
![Page 132: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/132.jpg)
132
![Page 133: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/133.jpg)
133
![Page 134: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/134.jpg)
134
Observable<Boolean> shouldEnableButtonObs = Observable .combineLatest( passObs.map(pass -> pass.trim()), confirmObs.map(confirm -> confirm.trim()), duplicatesCheckObservable, (pass, confirmPass, isNameUnique) -> TextUtils.equals(pass, confirmPass) && isNameUnique ); shouldEnableButtonObs .subscribe(enabled -> button.setEnabled(enabled));
![Page 135: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/135.jpg)
135
Observable<Boolean> shouldEnableButtonObs = Observable .combineLatest( passObs.map(pass -> pass.trim()), confirmObs.map(confirm -> confirm.trim()), duplicatesCheckObservable, (pass, confirmPass, isNameUnique) -> TextUtils.equals(pass, confirmPass) && isNameUnique ); shouldEnableButtonObs .subscribe(enabled -> button.setEnabled(enabled));
![Page 136: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/136.jpg)
136
Observable<Boolean> shouldEnableButtonObs = Observable .combineLatest( passObs.map(pass -> pass.trim()), confirmObs.map(confirm -> confirm.trim()), duplicatesCheckObservable, (pass, confirmPass, isNameUnique) -> TextUtils.equals(pass, confirmPass) && isNameUnique ); shouldEnableButtonObs .subscribe(enabled -> button.setEnabled(enabled));
![Page 137: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/137.jpg)
137
Observable<Boolean> shouldEnableButtonObs = Observable .combineLatest( passObs.map(pass -> pass.trim()), confirmObs.map(confirm -> confirm.trim()), duplicatesCheckObservable, (pass, confirmPass, isNameUnique) -> TextUtils.equals(pass, confirmPass) && isNameUnique ); shouldEnableButtonObs .subscribe(enabled -> button.setEnabled(enabled));
![Page 138: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/138.jpg)
138
Observable<Boolean> shouldEnableButtonObs = Observable .combineLatest( passObs.map(pass -> pass.trim()), confirmObs.map(confirm -> confirm.trim()), duplicatesCheckObservable, (pass, confirmPass, isNameUnique) -> TextUtils.equals(pass, confirmPass) && isNameUnique ); shouldEnableButtonObs .subscribe(enabled -> button.setEnabled(enabled));
![Page 139: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/139.jpg)
139
![Page 140: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/140.jpg)
А сколько у нас явного состояния?
![Page 141: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/141.jpg)
141
// нисколько
![Page 142: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/142.jpg)
• полезно знать все
142Операции
![Page 143: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/143.jpg)
• полезно знать все
• применение есть всем. Ищите!
143Операции
![Page 144: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/144.jpg)
• полезно знать все
• применение есть всем. Ищите!
• смотрите исходники
144Операции
![Page 145: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/145.jpg)
• полезно знать все
• применение есть всем. Ищите!
• смотрите исходники
• думайте!
145Операции
![Page 146: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/146.jpg)
Когда тредов > 1
![Page 147: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/147.jpg)
Scheduler
![Page 148: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/148.jpg)
• имеет пул потоков
148Scheduler
![Page 149: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/149.jpg)
• имеет пул потоков
• создает Scheduler.Worker
149Scheduler
![Page 150: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/150.jpg)
• имеет пул потоков
• создает Scheduler.Worker
• Worker –– цепочка последовательных вычислений
150Scheduler
![Page 151: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/151.jpg)
subscribeOn observeOn
![Page 152: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/152.jpg)
1. observeOn для того, что ниже по коду
![Page 153: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/153.jpg)
2. subscribeOn для того, что выше по коду
![Page 154: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/154.jpg)
3. Каждый следующий observeOn заменяет предыдущий
![Page 155: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/155.jpg)
4. subscribeOn актуален только до первого observeOn
![Page 156: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/156.jpg)
Оба оператора все еще возвращают новый поток
![Page 157: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/157.jpg)
157
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .onErrorReturn(throwable -> false);
![Page 158: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/158.jpg)
158
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .onErrorReturn(throwable -> false);
![Page 159: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/159.jpg)
159
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .observeOn(Schedulers.newThread()) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .subscribeOn(mainThread) .observeOn(mainThread) .onErrorReturn(throwable -> false);
![Page 160: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/160.jpg)
160
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .observeOn(Schedulers.newThread()) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .subscribeOn(mainThread) .observeOn(mainThread) .onErrorReturn(throwable -> false);
![Page 161: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/161.jpg)
161
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .observeOn(Schedulers.newThread()) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .subscribeOn(mainThread) .observeOn(mainThread) .onErrorReturn(throwable -> false);
![Page 162: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/162.jpg)
162
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .observeOn(Schedulers.newThread()) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .subscribeOn(mainThread) .observeOn(mainThread) .onErrorReturn(throwable -> false);
![Page 163: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/163.jpg)
163
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .observeOn(Schedulers.newThread()) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .subscribeOn(mainThread) .observeOn(mainThread) .onErrorReturn(throwable -> false);
![Page 164: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/164.jpg)
164
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .observeOn(Schedulers.newThread()) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .subscribeOn(mainThread) .observeOn(mainThread) .onErrorReturn(throwable -> false);
![Page 165: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/165.jpg)
165
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .observeOn(Schedulers.newThread()) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .subscribeOn(mainThread) .observeOn(mainThread) .onErrorReturn(throwable -> false);
![Page 166: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/166.jpg)
166
Observable<Boolean> duplicatesCheckObservable = nameObs .debounce(500, TimeUnit.MILLISECONDS) .observeOn(Schedulers.newThread()) .map(name -> requestDuplicates(name)) .map(response -> checkResponseForDuplicates(response)) .map(checkedResp -> calcDuplicates(checkedResp)) .subscribeOn(mainThread) .observeOn(mainThread) .onErrorReturn(throwable -> false); duplicatesCheckObservable.subscribe(isUnique -> { /*process*/ });
![Page 167: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/167.jpg)
Ложечка дегтя
![Page 168: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/168.jpg)
• объектов аллоцируется больше
168Ложечка дегтя
![Page 169: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/169.jpg)
• объектов аллоцируется больше
• сложно дебажить
169Ложечка дегтя
![Page 170: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/170.jpg)
• объектов аллоцируется больше
• сложно дебажить
• логируйте много
170Ложечка дегтя
![Page 171: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/171.jpg)
• объектов аллоцируется больше
• сложно дебажить
• логируйте много
• пишите правильно сразу
171Ложечка дегтя
![Page 172: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/172.jpg)
• объектов аллоцируется больше
• сложно дебажить
• логируйте много
• пишите правильно сразу
• сложно объяснить
172Ложечка дегтя
![Page 173: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/173.jpg)
• объектов аллоцируется больше
• сложно дебажить
• логируйте много
• пишите правильно сразу
• сложно объяснить
• сложно найти крутую команду
173Ложечка дегтя
![Page 174: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/174.jpg)
Итоги
![Page 175: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/175.jpg)
• изолированное состояние
175Итоги
![Page 176: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/176.jpg)
• изолированное состояние
• легкая многопоточность
176Итоги
![Page 177: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/177.jpg)
• изолированное состояние
• легкая многопоточность
• легкое комбинирование
177Итоги
![Page 178: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/178.jpg)
• изолированное состояние
• легкая многопоточность
• легкое комбинирование
• понятность кода
178Итоги
![Page 179: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/179.jpg)
• изолированное состояние
• легкая многопоточность
• легкое комбинирование
• понятность кода
• стойкость к ошибкам
179Итоги
![Page 180: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/180.jpg)
Reactive Extension
![Page 181: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/181.jpg)
Reactive Extension
![Page 182: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/182.jpg)
Reactive Extension
![Page 183: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/183.jpg)
Это круто!
![Page 184: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/184.jpg)
Меняйтесь
![Page 185: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/185.jpg)
За этим будущее
![Page 187: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/187.jpg)
Правильная реализация подсветки кнопки
![Page 188: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/188.jpg)
Observable<String> nameObs = EditTextObservable .from(nameEditText);Observable<Boolean> duplicatesCheckObservable2 = nameObs .flatMap(name -> DebouncedDuplicatesObservable .from(name) .startWith(false)) .onErrorReturn(thr -> false); duplicatesCheckObservable2. subscribe(isDubl -> { /*process*/ });
![Page 189: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/189.jpg)
Observable<String> nameObs = EditTextObservable .from(nameEditText);Observable<Boolean> duplicatesCheckObservable2 = nameObs .flatMap(name -> DebouncedDuplicatesObservable .from(name) .startWith(false)) .onErrorReturn(thr -> false); duplicatesCheckObservable2. subscribe(isDubl -> { /*process*/ });
![Page 190: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/190.jpg)
Observable<String> nameObs = EditTextObservable .from(nameEditText);Observable<Boolean> duplicatesCheckObservable2 = nameObs .flatMap(name -> DebouncedDuplicatesObservable .from(name) .startWith(false)) .onErrorReturn(thr -> false); duplicatesCheckObservable2. subscribe(isDubl -> { /*process*/ });
![Page 191: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/191.jpg)
Observable<String> nameObs = EditTextObservable .from(nameEditText);Observable<Boolean> duplicatesCheckObservable2 = nameObs .flatMap(name -> DebouncedDuplicatesObservable .from(name) .startWith(false)) .onErrorReturn(thr -> false); duplicatesCheckObservable2. subscribe(isDubl -> { /*process*/ });
![Page 192: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/192.jpg)
• Reactive Streams
• Akka Stream
• Reactor
• Ratpack
• RxJava
• Reactive Manifesto
192Ссылки
![Page 193: Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС](https://reader030.vdocuments.net/reader030/viewer/2022020101/55b3b666bb61eb06038b4582/html5/thumbnails/193.jpg)
• Reactive Extensions
• Reactive Extensions for JavaScript
• Reactive Cocoa
• Rx.py
• Rx.php
193Ссылки