The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf ·...

280
The Art of Rx Матвей Мальков

Transcript of The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf ·...

Page 1: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

The Art of RxМатвей Мальков

Page 2: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

2Обо мне

Page 3: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

3Обо мне

Page 4: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

4Обо мне

Page 5: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

5Обо мне

Page 6: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Èñêóññòâî ðåàêòèâíîãî ïðîãðàììèðîâàíèÿ

Page 7: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Èñêóññòâî – âûñîêàÿ ñòåïåíü ìàñòåðñòâà â êàêîé-ëèáî

ñôåðå äåÿòåëüíîñòè.

Page 8: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Íàø ãëàâíûé íàâûê – óìåíèå äóìàòü

Page 9: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

9Умение думать. Практика

Page 10: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• î ÷åì äóìàòü?

9Умение думать. Практика

Page 11: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• î ÷åì äóìàòü?

• êàê äóìàòü?

9Умение думать. Практика

Page 12: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

10О чем думать мобильному разработчику

Page 13: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ýíåðãîïîòðåáëåíèå

10О чем думать мобильному разработчику

Page 14: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ýíåðãîïîòðåáëåíèå

• ïëàâíîñòü èíòåðôåéñà (60 fps)

10О чем думать мобильному разработчику

Page 15: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ýíåðãîïîòðåáëåíèå

• ïëàâíîñòü èíòåðôåéñà (60 fps)

• ôðàãìåíòàöèÿ óñòðîéñòâ

10О чем думать мобильному разработчику

Page 16: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ýíåðãîïîòðåáëåíèå

• ïëàâíîñòü èíòåðôåéñà (60 fps)

• ôðàãìåíòàöèÿ óñòðîéñòâ

• ïîòðåáëåíèå ïàìÿòè

10О чем думать мобильному разработчику

Page 17: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

11Как думать мобильному разработчику?

Page 18: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• êàê ïîëüçîâàòåëü

11Как думать мобильному разработчику?

Page 19: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• êàê ïîëüçîâàòåëü

• êàê äèçàéíåð

11Как думать мобильному разработчику?

Page 20: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• êàê ïîëüçîâàòåëü

• êàê äèçàéíåð

• êàê ïðåäëàãàåò ôóíäàìåíòàëüíûé ôðåéìâîðê

11Как думать мобильному разработчику?

Page 21: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

12Фундаментальный фреймворк

Page 22: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äåëàåò ðàçðàáîòêó ïðîùå/ëó÷øå/áûñòðåå

12Фундаментальный фреймворк

Page 23: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äåëàåò ðàçðàáîòêó ïðîùå/ëó÷øå/áûñòðåå

• ïðèâíîñèò ÷òî-òî êîíöåïòóàëüíî íîâîå

12Фундаментальный фреймворк

Page 24: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äåëàåò ðàçðàáîòêó ïðîùå/ëó÷øå/áûñòðåå

• ïðèâíîñèò ÷òî-òî êîíöåïòóàëüíî íîâîå

• ïðîðàñòàåò âî âñå ïîäñèñòåìû

12Фундаментальный фреймворк

Page 25: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äåëàåò ðàçðàáîòêó ïðîùå/ëó÷øå/áûñòðåå

• ïðèâíîñèò ÷òî-òî êîíöåïòóàëüíî íîâîå

• ïðîðàñòàåò âî âñå ïîäñèñòåìû

• ñëîæíî óáðàòü

12Фундаментальный фреймворк

Page 26: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äåëàåò ðàçðàáîòêó ïðîùå/ëó÷øå/áûñòðåå

• ïðèâíîñèò ÷òî-òî êîíöåïòóàëüíî íîâîå

• ïðîðàñòàåò âî âñå ïîäñèñòåìû

• ñëîæíî óáðàòü

• òðåáóåò íàâûêîâ îáðàùåíèÿ

12Фундаментальный фреймворк

Page 27: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Íàø ëþáèìûé ôóíäàìåíòàëüíûé ôðåéìâîðê – RxJava

Page 28: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Î ÷eì äóìàòü, èñïîëüçóÿ RxJava?

Page 29: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Î êîíòðàêòàõ

Page 30: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

16О контрактах

Page 31: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

16О контрактах

Page 32: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

• ïîíèìàíèå

16О контрактах

Page 33: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

• ïîíèìàíèå

• ñîáëþäåíèå

16О контрактах

Page 34: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

• ïîíèìàíèå

• ñîáëþäåíèå

• âàæíî:

16О контрактах

Page 35: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

• ïîíèìàíèå

• ñîáëþäåíèå

• âàæíî:

• îñíîâû

16О контрактах

Page 36: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

17Нотификации

Page 37: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• onNext – 0, n èëè inf

17Нотификации

Page 38: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• onNext – 0, n èëè inf

• onCompleted – 0 èëè 1

17Нотификации

Page 39: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• onNext – 0, n èëè inf

• onCompleted – 0 èëè 1

• onError – 0 èëè 1

17Нотификации

Page 40: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• onNext – 0, n èëè inf

• onCompleted – 0 èëè 1

• onError – 0 èëè 1

• onCompleted + onError <= 1

17Нотификации

Page 41: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

18Подписка и отписка

Page 42: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• íå íóæíî îòïèñûâàòüñÿ ïîñëå çàâåðøåíèÿ

18Подписка и отписка

Page 43: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• íå íóæíî îòïèñûâàòüñÿ ïîñëå çàâåðøåíèÿ

• ïðè îòïèñêå çàâåðøåíèå íå ãàðàíòèðîâàíî

18Подписка и отписка

Page 44: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

19Observable<Response> obs = Observable .interval(1, TimeUnit.SECONDS) .map(this!::sendPing) .cache();

Page 45: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

20Observable<Response> obs = Observable .interval(1, TimeUnit.SECONDS) .map(this!::sendPing) .cache();

Page 46: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

21Observable<Response> obs = Observable .interval(1, TimeUnit.SECONDS) .map(this!::sendPing) .cache();

Page 47: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

22Observable<Response> obs = Observable .interval(1, TimeUnit.SECONDS) .map(this!::sendPing) .cache();

Page 48: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

23Observable<Response> obs = Observable .interval(1, TimeUnit.SECONDS) .map(this!::sendPing) .cache();Subscription sub = obs.subscribe();

Page 49: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

24Observable<Response> obs = Observable .interval(1, TimeUnit.SECONDS) .map(this!::sendPing) .cache();Subscription sub = obs.subscribe();!//позжеsub.unsubscribe();

Page 50: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

25Observable<Response> obs = Observable .interval(1, TimeUnit.SECONDS) .map(this!::sendPing) .cache();Subscription sub = obs.subscribe();!//позжеsub.unsubscribe();

Note: You sacrifice the ability to unsubscribe from the origin

Page 51: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

26Observable<Response> obs = Observable .interval(1, TimeUnit.SECONDS) .map(this!::sendPing) .cache();Subscription sub = obs.subscribe();!//позжеsub.unsubscribe();

Note: You sacrifice the ability to unsubscribe from the origin

Page 52: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

27О контрактах

Page 53: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• îòïðàâêà íîòèôèêàöèé

27О контрактах

Page 54: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• îòïðàâêà íîòèôèêàöèé

• çàâåðøåíèå ñ îøèáêîé

27О контрактах

Page 55: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• îòïðàâêà íîòèôèêàöèé

• çàâåðøåíèå ñ îøèáêîé

• ïîëíûé ñïèñîê : http://reactivex.io/documentation/contract.html

27О контрактах

Page 56: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

28Состояние системы

Page 57: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èçîëèðîâàííî

28Состояние системы

Page 58: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èçîëèðîâàííî

• îäèí èñòî÷íèê

28Состояние системы

Page 59: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èçîëèðîâàííî

• îäèí èñòî÷íèê

• íåèçìåíÿåìî

28Состояние системы

Page 60: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èçîëèðîâàííî

• îäèí èñòî÷íèê

• íåèçìåíÿåìî

• ïîä÷èíÿåòñÿ êîíòðàêòó Observable

28Состояние системы

Page 61: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

29

nameEditTextChanges.subscribe(this!::updateName);

Page 62: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

30

nameEditTextChanges.subscribe(this!::updateName);

PublishSubject<Integer> nameEditTextChanges = PublishSubject.create();

Page 63: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

31

nameEditTextChanges.subscribe(this!::updateName);

PublishSubject<Integer> nameEditTextChanges = PublishSubject.create();

nameEditTextChanges.onNext("хаха, обманул!");

Page 64: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Subject – âîçìîæíîå íàðóøåíèå êîíòðàêòà

Page 65: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Subject – âîçìîæíîå íàðóøåíèå êîíòðàêòà

Page 66: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èçîëèðîâàííî

• îäèí èñòî÷íèê

• íåèçìåíÿåìî

• ïîä÷èíÿåòñÿ êîíòðàêòó Observable

34Состояние системы

Page 67: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

35Subjects

Page 68: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ñîåäèíåíèå èìïåðàòèâíîãî è ðåàêòèâíîãî ìèðà

35Subjects

Page 69: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ñîåäèíåíèå èìïåðàòèâíîãî è ðåàêòèâíîãî ìèðà

• êîãäà íåâîçìîæíî ñäåëàòü ïî äðóãîìó

35Subjects

Page 70: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ñîåäèíåíèå èìïåðàòèâíîãî è ðåàêòèâíîãî ìèðà

• êîãäà íåâîçìîæíî ñäåëàòü ïî äðóãîìó

• ýòî âàø ñëó÷àé? ÍÅÒ!

35Subjects

Page 71: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ñîåäèíåíèå èìïåðàòèâíîãî è ðåàêòèâíîãî ìèðà

• êîãäà íåâîçìîæíî ñäåëàòü ïî äðóãîìó

• ýòî âàø ñëó÷àé? ÍÅÒ!

• âñå òàêè âàø? Íåò, ýòî íå òàê!

35Subjects

Page 72: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ñîåäèíåíèå èìïåðàòèâíîãî è ðåàêòèâíîãî ìèðà

• êîãäà íåâîçìîæíî ñäåëàòü ïî äðóãîìó

• ýòî âàø ñëó÷àé? ÍÅÒ!

• âñå òàêè âàø? Íåò, ýòî íå òàê!

• ìåíüøå – ëó÷øå

35Subjects

Page 73: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

О тредах

Page 74: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

37О тредах

Page 75: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû

37О тредах

Page 76: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû

• íåò ïîíèìàÿ ðàáîòû

37О тредах

Page 77: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû

• íåò ïîíèìàÿ ðàáîòû

• ñóþò subscribeOn è observeOn âåçäå ïîäðÿä

37О тредах

Page 78: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû

• íåò ïîíèìàÿ ðàáîòû

• ñóþò subscribeOn è observeOn âåçäå ïîäðÿä

• âàæíî :

37О тредах

Page 79: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû

• íåò ïîíèìàÿ ðàáîòû

• ñóþò subscribeOn è observeOn âåçäå ïîäðÿä

• âàæíî :

• ðàçáèðàòüñÿ

37О тредах

Page 80: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

38Scheduler

Page 81: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïëàíèðîâêà çàäà÷

38Scheduler

Page 82: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïëàíèðîâêà çàäà÷

• ðàáîòà ñ òðåäàìè

38Scheduler

Page 83: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïëàíèðîâêà çàäà÷

• ðàáîòà ñ òðåäàìè

• subscribeOn

38Scheduler

Page 84: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïëàíèðîâêà çàäà÷

• ðàáîòà ñ òðåäàìè

• subscribeOn

• observeOn

38Scheduler

Page 85: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Äîãìû observeOn

subscribeOn

Page 86: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

1. observeOn ìåíÿåò Scheduler äëÿ âñåãî, ÷òî íèæå ïî êîäó

Page 87: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

2. subscribeOn ìåíÿåò Scheduler ñ ñàìîãî âåðõà öåïî÷êè

Page 88: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

3. Êàæäûé ñëåäóþùèé observeOn çàìåíÿåò ïðåäûäóùèé

Page 89: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

4. subscribeOn àêòóàëåí äî ïåðâîãî observeOn

Page 90: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Âñåãäà äóìàéòå î òîì, â êàêîì òðåäå âûïîëíÿåòñÿ ôóíêöèÿ

Page 91: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

45

Observable<Response> requestObs = userDbChanges .filter(u 0-> u.age < 18) .map(this!::toRequestModel) .map(this!::doRequest) .onErrorReturn(this!::doRecoverReq) .map(this!::cacheAndModify);!//ui threadrequestObs.subscribe(this!::showOnUi);

Page 92: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

46

Observable<Response> requestObs = userDbChanges .filter(u 0-> u.age < 18) .map(this!::toRequestModel) .map(this!::doRequest) .onErrorReturn(this!::doRecoverReq) .map(this!::cacheAndModify);!//ui threadrequestObs.subscribe(this!::showOnUi);

Page 93: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

47

Observable<Response> requestObs = userDbChanges .filter(u 0-> u.age < 18) .map(this!::toRequestModel) .observeOn(networkScheduler) .map(this!::doRequest) .onErrorReturn(this!::doRecoverReq) .subscribeOn(Schedulers.computation()) .observeOn(mainThread) .map(this!::toUiModel);!//ui threadrequestObs.subscribe(this!::showOnUi);

Page 94: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

48

Observable<Response> requestObs = userDbChanges .filter(u 0-> u.age < 18) .map(this!::toRequestModel) .observeOn(networkScheduler) .map(this!::doRequest) .onErrorReturn(this!::doRecoverReq) .subscribeOn(Schedulers.computation()) .observeOn(mainThread) .map(this!::toUiModel);!//ui threadrequestObs.subscribe(this!::showOnUi);

Page 95: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

49

Observable<Response> requestObs = userDbChanges .filter(u 0-> u.age < 18) .map(this!::toRequestModel) .observeOn(networkScheduler) .map(this!::doRequest) .onErrorReturn(this!::doRecoverReq) .subscribeOn(Schedulers.computation()) .observeOn(mainThread) .map(this!::toUiModel);!//ui threadrequestObs.subscribe(this!::showOnUi);

Page 96: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

50

Observable<Response> requestObs = userDbChanges .filter(u 0-> u.age < 18) .map(this!::toRequestModel) .observeOn(networkScheduler) .map(this!::doRequest) .onErrorReturn(this!::doRecoverReq) .subscribeOn(Schedulers.computation()) .observeOn(mainThread) .map(this!::toUiModel);!//ui threadrequestObs.subscribe(this!::showOnUi);

Page 97: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

51

Observable<Response> requestObs = userDbChanges .filter(u 0-> u.age < 18) .map(this!::toRequestModel) .observeOn(networkScheduler) .map(this!::doRequest) .onErrorReturn(this!::doRecoverReq) .subscribeOn(Schedulers.computation()) .observeOn(mainThread) .map(this!::toUiModel);!//ui threadrequestObs.subscribe(this!::showOnUi);

Page 98: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

52

Observable<Response> requestObs = userDbChanges .filter(u 0-> u.age < 18) .map(this!::toRequestModel) .observeOn(networkScheduler) .map(this!::doRequest) .onErrorReturn(this!::doRecoverReq) .subscribeOn(Schedulers.computation()) .observeOn(mainThread) .map(this!::toUiModel);!//ui threadrequestObs.subscribe(this!::showOnUi);

Page 99: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

53

Observable<Response> requestObs = userDbChanges .filter(u 0-> u.age < 18) .map(this!::toRequestModel) .observeOn(networkScheduler) .map(this!::doRequest) .onErrorReturn(this!::doRecoverReq) .subscribeOn(Schedulers.computation()) .observeOn(mainThread) .map(this!::toUiModel);!//ui threadrequestObs.subscribe(this!::showOnUi);

Page 100: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Âåëèêîëåïíûé subscribeOn

Page 101: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

55subscribeOn

public final Observable<T> subscribeOn(Scheduler scheduler) { !//какой-то неважный код return nest().lift(new OperatorSubscribeOn<T>(scheduler));}

Page 102: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

56subscribeOn

public final Observable<T> subscribeOn(Scheduler scheduler) { !//какой-то неважный код return nest().lift(new OperatorSubscribeOn<T>(scheduler));}

Page 103: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

57

public final Observable<Observable<T9>> nest() { return just(this);}

Page 104: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

58

Page 105: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

59

nest

Page 106: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

60

nest

Page 107: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

61subscribeOn

public final Observable<T> subscribeOn(Scheduler scheduler) { !//какой-то неважный код return nest().lift(new OperatorSubscribeOn<T>(scheduler));}

Page 108: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

62subscribeOn

public final Observable<T> subscribeOn(Scheduler scheduler) { !//какой-то неважный код return nest().lift(new OperatorSubscribeOn<T>(scheduler));}

Page 109: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

63subscribeOn

public final Observable<T> subscribeOn(Scheduler scheduler) { !//какой-то неважный код return nest().lift(new OperatorSubscribeOn<T>(scheduler));}

Page 110: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

64

public class OperatorSubscribeOn<T> implements Operator<T, Observable<T9>> { private final Scheduler scheduler; public OperatorSubscribeOn(Scheduler scheduler) { this.scheduler = scheduler; } @Override public Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { … }

Page 111: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

65

public class OperatorSubscribeOn<T> implements Operator<T, Observable<T9>> { private final Scheduler scheduler; public OperatorSubscribeOn(Scheduler scheduler) { this.scheduler = scheduler; } @Override public Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { … }

принимаетвозвращает

Page 112: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

66

public class OperatorSubscribeOn<T> implements Operator<T, Observable<T9>> { private final Scheduler scheduler; public OperatorSubscribeOn(Scheduler scheduler) { this.scheduler = scheduler; } @Override public Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { … }

Page 113: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

67@Overridepublic Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { final Worker inner = scheduler.createWorker(); subscriber.add(inner); return new Subscriber<Observable<T9>>(subscriber) { @Override public void onNext(final Observable<T> o) { inner.schedule(new Action0() { @Override public void call() { final Thread t = Thread.currentThread(); o.unsafeSubscribe(new Subscriber<T>(subscriber) { !//обычный inner subscribe } !//тут еще оооочень много закрывающихся скобочек}

Page 114: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

68@Overridepublic Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { final Worker inner = scheduler.createWorker(); subscriber.add(inner); return new Subscriber<Observable<T9>>(subscriber) { @Override public void onNext(final Observable<T> o) { inner.schedule(new Action0() { @Override public void call() { final Thread t = Thread.currentThread(); o.unsafeSubscribe(new Subscriber<T>(subscriber) { !//обычный inner subscribe } !//тут еще оооочень много закрывающихся скобочек}

Page 115: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

69@Overridepublic Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { final Worker inner = scheduler.createWorker(); subscriber.add(inner); return new Subscriber<Observable<T9>>(subscriber) { @Override public void onNext(final Observable<T> o) { inner.schedule(new Action0() { @Override public void call() { final Thread t = Thread.currentThread(); o.unsafeSubscribe(new Subscriber<T>(subscriber) { !//обычный inner subscribe } !//тут еще оооочень много закрывающихся скобочек}

Page 116: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

70@Overridepublic Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { final Worker inner = scheduler.createWorker(); subscriber.add(inner); return new Subscriber<Observable<T9>>(subscriber) { @Override public void onNext(final Observable<T> o) { inner.schedule(new Action0() { @Override public void call() { final Thread t = Thread.currentThread(); o.unsafeSubscribe(new Subscriber<T>(subscriber) { !//обычный inner subscribe } !//тут еще оооочень много закрывающихся скобочек}

Page 117: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

71@Overridepublic Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { final Worker inner = scheduler.createWorker(); subscriber.add(inner); return new Subscriber<Observable<T9>>(subscriber) { @Override public void onNext(final Observable<T> o) { inner.schedule(new Action0() { @Override public void call() { final Thread t = Thread.currentThread(); o.unsafeSubscribe(new Subscriber<T>(subscriber) { !//обычный inner subscribe } !//тут еще оооочень много закрывающихся скобочек}

Наш Observable

Page 118: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

72@Overridepublic Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { final Worker inner = scheduler.createWorker(); subscriber.add(inner); return new Subscriber<Observable<T9>>(subscriber) { @Override public void onNext(final Observable<T> o) { inner.schedule(new Action0() { @Override public void call() { final Thread t = Thread.currentThread(); o.unsafeSubscribe(new Subscriber<T>(subscriber) { !//обычный inner subscribe } !//тут еще оооочень много закрывающихся скобочек}

Page 119: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

73@Overridepublic Subscriber<? super Observable<T9>> call(final Subscriber<? super T> subscriber) { final Worker inner = scheduler.createWorker(); subscriber.add(inner); return new Subscriber<Observable<T9>>(subscriber) { @Override public void onNext(final Observable<T> o) { inner.schedule(new Action0() { @Override public void call() { final Thread t = Thread.currentThread(); o.unsafeSubscribe(new Subscriber<T>(subscriber) { !//обычный inner subscribe } !//тут еще оооочень много закрывающихся скобочек}

Page 120: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

74

Page 121: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

75

OperatorSubscribeOn(Scheduler)

Page 122: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

76

OperatorSubscribeOn(Scheduler)

Page 123: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Ãåíèàëüíî!

Page 124: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

78

Observable.just(1) .subscribeOn(scheduler1) .subscribeOn(scheduler2) .subscribe();

Page 125: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

79

Observable.just(1) .subscribeOn(scheduler1) .subscribeOn(scheduler2) .subscribe(); !//scheduler1

Page 126: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

2. subscribeOn ìåíÿåò Scheduler ñ ñàìîãî âåðõà öåïî÷êè

Page 127: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

2. Ïåðâûé subscribeOn ìåíÿåò Scheduler ñ ñàìîãî âåðõà öåïî÷êè

Page 128: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

82

!//computationObservable<Long> o1 = Observable.interval(1, TimeUnit.SECONDS); !//networkObservable<Integer> o2 = Observable.just(1) .observeOn(networkScheduler);Observable.zip(o1, o2, o3, (r1, r2) 0-> r1 * r2);

Page 129: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

83

!//computationObservable<Long> o1 = Observable.interval(1, TimeUnit.SECONDS); !//networkObservable<Integer> o2 = Observable.just(1) .observeOn(networkScheduler);Observable.zip(o1, o2, o3, (r1, r2) 0-> r1 * r2);

Page 130: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

84

!//computationObservable<Long> o1 = Observable.interval(1, TimeUnit.SECONDS); !//networkObservable<Integer> o2 = Observable.just(1) .observeOn(networkScheduler);Observable.zip(o1, o2, o3, (r1, r2) 0-> r1 * r2); !//computation or network

Page 131: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

85final class InnerSubscriber extends Subscriber { @Override public void onNext(Object t) { try { items.onNext(t); } catch (MissingBackpressureException e) { onError(e); } tick(); }};

Page 132: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

86final class InnerSubscriber extends Subscriber { @Override public void onNext(Object t) { try { items.onNext(t); } catch (MissingBackpressureException e) { onError(e); } tick(); }};

Page 133: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

87

void tick() { !//тут много кода, не имеющего сейчас значения if (requested.get() > 0 !&& allHaveValues) { try { !// всем потокам есть что zip’ать child.onNext(zipFunction.call(vs));

} !// еще много кода и скобочки

Page 134: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

88

void tick() { !//тут много кода, не имеющего сейчас значения if (requested.get() > 0 !&& allHaveValues) { try { !// всем потокам есть что zip’ать child.onNext(zipFunction.call(vs));

} !// еще много кода и скобочки

Page 135: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

89

void tick() { !//тут много кода, не имеющего сейчас значения if (requested.get() > 0 !&& allHaveValues) { try { !// всем потокам есть что zip’ать child.onNext(zipFunction.call(vs));

} !// еще много кода и скобочки

Page 136: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Âñåãäà äóìàéòå î òîì, â êàêîì òðåäå âûïîëíÿåòñÿ ôóíêöèÿ

Page 137: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

О количестве элементов

Page 138: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

92Количество элементов

Page 139: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

92Количество элементов

Page 140: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

• áîëüøå ýëåìåíòîâ – áîëüøå ìóñîðà

92Количество элементов

Page 141: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

• áîëüøå ýëåìåíòîâ – áîëüøå ìóñîðà

• RxJava ïîñòîÿííî âñå êîïèðóåò

92Количество элементов

Page 142: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

• áîëüøå ýëåìåíòîâ – áîëüøå ìóñîðà

• RxJava ïîñòîÿííî âñå êîïèðóåò

• âàæíî:

92Количество элементов

Page 143: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

• áîëüøå ýëåìåíòîâ – áîëüøå ìóñîðà

• RxJava ïîñòîÿííî âñå êîïèðóåò

• âàæíî:

• íå ïàíèêîâàòü

92Количество элементов

Page 144: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ïðîáëåìû:

• áîëüøå ýëåìåíòîâ – áîëüøå ìóñîðà

• RxJava ïîñòîÿííî âñå êîïèðóåò

• âàæíî:

• íå ïàíèêîâàòü

• çàáîòèòüñÿ î GC

92Количество элементов

Page 145: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

93Не паниковать

Page 146: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• «×òî ñ GC?» : ñàìûé æàðêèé âîïðîñ

93Не паниковать

Page 147: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• «×òî ñ GC?» : ñàìûé æàðêèé âîïðîñ

• êîïèðîâàíèå òîëüêî ïðè íîòèôèêàöèÿõ

93Не паниковать

Page 148: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• «×òî ñ GC?» : ñàìûé æàðêèé âîïðîñ

• êîïèðîâàíèå òîëüêî ïðè íîòèôèêàöèÿõ

• âñå îïòèìèçèðîâàííî

93Не паниковать

Page 149: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

94

locationUpdates() .distinctUntilChanged() .subscribe();

Page 150: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

95

locationUpdates() .distinctUntilChanged() .subscribe();

Page 151: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

96

locationUpdates() .distinctUntilChanged() .subscribe();

touchEvents(view) .filter(e 0-> e.x > minWidth !&& e.y > minHeight) .doOnNext(this!::processEvents) .subscribe();

Page 152: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

97

locationUpdates() .distinctUntilChanged() .subscribe();

touchEvents(view) .filter(e 0-> e.x > minWidth !&& e.y > minHeight) .doOnNext(this!::processEvents) .subscribe();

Page 153: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

98

nameEditTextChanges .map(this!::prepareForSending) .map(this!::sendName) .map(this!::cacheAndModify);

Page 154: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

99

nameEditTextChanges .map(this!::prepareForSending) !//раз .map(this!::sendName) .map(this!::cacheAndModify);

Page 155: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

100

nameEditTextChanges .map(this!::prepareForSending) !//раз .map(this!::sendName) !// два .map(this!::cacheAndModify);

Page 156: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

101

nameEditTextChanges .map(this!::prepareForSending) !//раз .map(this!::sendName) !// два .map(this!::cacheAndModify); !// три

Page 157: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

102

nameEditTextChanges .debounce(500, TimeUnit.MILLISECONDS) .map(this!::prepareForSending) .map(this!::sendName) .map(this!::cacheAndModify);

Page 158: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

103debounce

Page 159: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• áåðåæåò GC

103debounce

Page 160: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• áåðåæåò GC

• áåðåæåò òðàôèê ïîëüçîâàòåëÿ

103debounce

Page 161: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• áåðåæåò GC

• áåðåæåò òðàôèê ïîëüçîâàòåëÿ

• áåðåæåò íàñ îò BackPressure

103debounce

Page 162: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

104Backpressure

Page 163: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• îòäàþùèé òðåä äàåò ìíîãî

104Backpressure

Page 164: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• îòäàþùèé òðåä äàåò ìíîãî

• ïðèíèìàþùèé òðåä íå óñïåâàåò

104Backpressure

Page 165: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• îòäàþùèé òðåä äàåò ìíîãî

• ïðèíèìàþùèé òðåä íå óñïåâàåò

• â ìíîãîïîòî÷íîé ñðåäå ìíîãîâåðîÿòíî

104Backpressure

Page 166: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• îòäàþùèé òðåä äàåò ìíîãî

• ïðèíèìàþùèé òðåä íå óñïåâàåò

• â ìíîãîïîòî÷íîé ñðåäå ìíîãîâåðîÿòíî

• ïåðâûé ïðèçíàê – observeOn

104Backpressure

Page 167: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

105

events

touchEvents(view)

Page 168: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

106

events filter

touchEvents(view) .filter(e 0-> e.x > minWidth)

Page 169: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

107

events filter map

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize)

Page 170: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

108

events filter map observeOn

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler)

Page 171: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

109

events filter map observeOn

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending)

map

Page 172: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

110

events filter map observeOn

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest)

map map

Page 173: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

111

events filter map observeOn

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

map map subscriber

Page 174: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

112

events filter map observeOn

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

map map subscriber

Page 175: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

113

events filter map observeOn

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

map map subscriber

Page 176: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

114

events filter map observeOn

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

map map subscriber

Page 177: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

115

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 178: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

116

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 179: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

117

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 180: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

118

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 181: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

119

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 182: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

120

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 183: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

121

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 184: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

122

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 185: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

123

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 186: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

124

events filter map observeOn

map map subscribertouchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 187: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

125

events filter map observeOn

map map subscriber

2

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 188: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

126

events filter map observeOn

map map subscriber

2

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 189: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

127

events filter map observeOn

map map subscriber

2

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 190: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

128

events filter map observeOn

map map subscriber

2

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 191: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

129

events filter map observeOn

map map subscriber

3

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 192: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

130

events filter map observeOn

map map subscriber

3

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 193: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

131

events filter map observeOn

map map subscriber

3

Устал

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 194: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

132

events filter map observeOn

map map subscriber

3

Устал

touchEvents(view) .filter(e 0-> e.x > minWidth) .map(this!::normalize) .observeOn(networkScheduler) .map(this!::prepareForSending) .map(this!::doMotionRequest) .subscribe()

Page 195: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

133

events filter map observeOn

map map subscriber

4

rx.exceptions.MissingBackpressureException

Page 196: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

134

Observable.zip( Observable.interval(10, TimeUnit.MILLISECONDS), Observable.interval(20, TimeUnit.MILLISECONDS), (r1, r2) 0-> r1 * r2).subscribe();

Page 197: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

135

Observable.zip( Observable.interval(10, TimeUnit.MILLISECONDS), Observable.interval(20, TimeUnit.MILLISECONDS), (r1, r2) 0-> r1 * r2).subscribe();

Page 198: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

136

Observable.zip( Observable.interval(10, TimeUnit.MILLISECONDS), Observable.interval(20, TimeUnit.MILLISECONDS), (r1, r2) 0-> r1 * r2).subscribe();

Page 199: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

137

Observable.zip( Observable.interval(10, TimeUnit.MILLISECONDS), Observable.interval(20, TimeUnit.MILLISECONDS), (r1, r2) 0-> r1 * r2).subscribe();

Page 200: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

138

Observable.zip( Observable.interval(10, TimeUnit.MILLISECONDS), Observable.interval(20, TimeUnit.MILLISECONDS), (r1, r2) 0-> r1 * r2).subscribe();

rx.exceptions.MissingBackpressureException

Page 201: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

139Борьба с Backpressure

Page 202: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• debounce, throttle

139Борьба с Backpressure

Page 203: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• debounce, throttle

• window, buffer

139Борьба с Backpressure

Page 204: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• debounce, throttle

• window, buffer

• onBackpressureBuffer

139Борьба с Backpressure

Page 205: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• debounce, throttle

• window, buffer

• onBackpressureBuffer

• onBackpressureDrop

139Борьба с Backpressure

Page 206: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

140

Page 207: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

141

Page 208: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Âñåãäà äóìàéòå î òîì, ñêîëüêî ýëåìåíòîâ âàì íóæíî

îò Observable

Page 209: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Êàê äóìàòü, èñïîëüçóÿ RxJava?

Page 210: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Как инженер

Page 211: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

145Как инженер

Page 212: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• íå áîéñÿ ðàñøèðÿòü ôðåéìâîðê

145Как инженер

Page 213: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• íå áîéñÿ ðàñøèðÿòü ôðåéìâîðê

• ïîíèìàé, êàê îí ðàáîòàåò âíóòðè

145Как инженер

Page 214: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

146DoOnNextAsync

Page 215: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• doOnNext == ñàéä ýôôåêò

146DoOnNextAsync

Page 216: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• doOnNext == ñàéä ýôôåêò

• íå áëîêèðîâàòü âûïîëíåíèå ðîäèòåëÿ

146DoOnNextAsync

Page 217: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• doOnNext == ñàéä ýôôåêò

• íå áëîêèðîâàòü âûïîëíåíèå ðîäèòåëÿ

• áûë ïðèâÿçàí ê æèçíåííîìó öèêëó ðîäèòåëÿ

146DoOnNextAsync

Page 218: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• doOnNext == ñàéä ýôôåêò

• íå áëîêèðîâàòü âûïîëíåíèå ðîäèòåëÿ

• áûë ïðèâÿçàí ê æèçíåííîìó öèêëó ðîäèòåëÿ

• íå ÷åðåç Subjects

146DoOnNextAsync

Page 219: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

147

userDbChanges .map(this!::doRequest) .doOnNext(resp 0-> { globalSubscription = createCacheObs(resp) .subscribe(); }) .map(this!::doAnotherRequest);

Page 220: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

148

userDbChanges .map(this!::doRequest) .doOnNext(resp 0-> { globalSubscription = createCacheObs(resp) .subscribe(); }) .map(this!::doAnotherRequest);

Page 221: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

149

userDbChanges .map(this!::doRequest) .lift(new DoOnNextAsyncG<>(this!::cacheObs)) .map(this!::doAnotherRequest);

Page 222: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

150

userDbChanges .map(this!::doRequest) .lift(new DoOnNextAsyncG<>(this!::cacheObs)) .map(this!::doAnotherRequest);

Page 223: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

151

class DoOnNextAsync<F, T> implements Observable.Operator<F, F> { private final Func1<F, Observable<T9>> nested; public DoOnNextAsync(Func1<F, Observable<T9>> func) { this.nested = func; } !//больше кода дальше

Page 224: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

152

class DoOnNextAsync<F, T> implements Observable.Operator<F, F> { private final Func1<F, Observable<T9>> nested; public DoOnNextAsync(Func1<F, Observable<T9>> func) { this.nested = func; } !//больше кода дальше

Page 225: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

153

class DoOnNextAsync<F, T> implements Observable.Operator<F, F> { private final Func1<F, Observable<T9>> nested; public DoOnNextAsync(Func1<F, Observable<T9>> func) { this.nested = func; } !//больше кода дальше

Page 226: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

154

@Overridepublic Subscriber<? super F> call(Subscriber<? super F> subscriber) { return new Subscriber<F>() { @Override public void onNext(F next) { if (!subscriber.isUnsubscribed()) { Subscription s = nested.call(next).subscribe(); subscriber.add(s); } }

!//тривиальные onError и onCompleted здесь };}

Page 227: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

155

@Overridepublic Subscriber<? super F> call(Subscriber<? super F> subscriber) { return new Subscriber<F>() { @Override public void onNext(F next) { if (!subscriber.isUnsubscribed()) { Subscription s = nested.call(next).subscribe(); subscriber.add(s); } }

!//тривиальные onError и onCompleted здесь };}

Page 228: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

156

@Overridepublic Subscriber<? super F> call(Subscriber<? super F> subscriber) { return new Subscriber<F>() { @Override public void onNext(F next) { if (!subscriber.isUnsubscribed()) { Subscription s = nested.call(next).subscribe(); subscriber.add(s); } }

!//тривиальные onError и onCompleted здесь };}

Page 229: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

157

@Overridepublic Subscriber<? super F> call(Subscriber<? super F> subscriber) { return new Subscriber<F>() { @Override public void onNext(F next) { if (!subscriber.isUnsubscribed()) { Subscription s = nested.call(next).subscribe(); subscriber.add(s); } }

!//тривиальные onError и onCompleted здесь };}

Page 230: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

158

@Overridepublic Subscriber<? super F> call(Subscriber<? super F> subscriber) { return new Subscriber<F>() { @Override public void onNext(F next) { if (!subscriber.isUnsubscribed()) { Subscription s = nested.call(next).subscribe(); subscriber.add(s); } }

!//тривиальные onError и onCompleted здесь };}

Page 231: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• Operator, lift,

• subscribeOn, observeOn

• nest, defer, create

159Понимай, как работает внутри

Page 232: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Думай реактивно

Page 233: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

161Думать реактивно

Page 234: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ñîåäèíÿòü èìïåðàòèâíûé è ðåàêòèâíûé ìèð

161Думать реактивно

Page 235: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ñîåäèíÿòü èìïåðàòèâíûé è ðåàêòèâíûé ìèð

• íå èñïîëüçîâàòü ñàáäæåêòû

161Думать реактивно

Page 236: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• ñîåäèíÿòü èìïåðàòèâíûé è ðåàêòèâíûé ìèð

• íå èñïîëüçîâàòü ñàáäæåêòû

• îïèñûâàòü, «êàê äåëàòü», à íå «÷òî äåëàòü»

161Думать реактивно

Page 237: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

162AutoLoadingRecyclerView

Page 238: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• íàó÷èòü RecycerView àâòîïîäãðóçêå

162AutoLoadingRecyclerView

Page 239: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• íàó÷èòü RecycerView àâòîïîäãðóçêå

• ñäåëàòü ñ ïîìîùüþ RxJava

162AutoLoadingRecyclerView

Page 240: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• íàó÷èòü RecycerView àâòîïîäãðóçêå

• ñäåëàòü ñ ïîìîùüþ RxJava

• â ðåàêòèâíîì ñòèëå

162AutoLoadingRecyclerView

Page 241: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

163

public class AutoLoadingRecyclerView<T> extends RecyclerView { protected PublishSubject<Pair<Integer, Integer9>> scrollLoadingChannel = PublishSubject.create(); protected void startScrollingChannel() { addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (shouldLoad()) { int offset = getAdapter().getItemCount(); scrollLoadingChannel.onNext(new Pair(offset, limit)); } } }); }

Page 242: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

164

public class AutoLoadingRecyclerView<T> extends RecyclerView { protected PublishSubject<Pair<Integer, Integer9>> scrollLoadingChannel = PublishSubject.create(); protected void startScrollingChannel() { addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (shouldLoad()) { int offset = getAdapter().getItemCount(); scrollLoadingChannel.onNext(new Pair(offset, limit)); } } }); }

Page 243: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

165

public class AutoLoadingRecyclerView<T> extends RecyclerView { protected PublishSubject<Pair<Integer, Integer9>> scrollLoadingChannel = PublishSubject.create(); protected void startScrollingChannel() { addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (shouldLoad()) { int offset = getAdapter().getItemCount(); scrollLoadingChannel.onNext(new Pair(offset, limit)); } } }); }

Page 244: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

166

public class AutoLoadingRecyclerView<T> extends RecyclerView { protected PublishSubject<Pair<Integer, Integer9>> scrollLoadingChannel = PublishSubject.create(); protected void startScrollingChannel() { addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (shouldLoad()) { int offset = getAdapter().getItemCount(); scrollLoadingChannel.onNext(new Pair(offset, limit)); } } }); }

Page 245: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

167

public class AutoLoadingRecyclerView<T> extends RecyclerView { protected PublishSubject<Pair<Integer, Integer9>> scrollLoadingChannel = PublishSubject.create(); protected void startScrollingChannel() { addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (shouldLoad()) { int offset = getAdapter().getItemCount(); scrollLoadingChannel.onNext(new Pair(offset, limit)); } } }); }

Page 246: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

168

public class AutoLoadingRecyclerView<T> extends RecyclerView { protected PublishSubject<OffsetAndLimit> scrollLoadingChannel = PublishSubject.create(); protected Subscription loadNewItemsSubscription; protected Subscription subscribeToLoadingChannelSubscription;

Page 247: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

169

public class AutoLoadingRecyclerView<T> extends RecyclerView { protected PublishSubject<OffsetAndLimit> scrollLoadingChannel = PublishSubject.create(); protected Subscription loadNewItemsSubscription; protected Subscription subscribeToLoadingChannelSubscription;

Page 248: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

170

public class AutoLoadingRecyclerView<T> extends RecyclerView { protected PublishSubject<OffsetAndLimit> scrollLoadingChannel = PublishSubject.create(); protected Subscription loadNewItemsSubscription; protected Subscription subscribeToLoadingChannelSubscription;

Page 249: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

171

private static Observable<Integer>getScrollObservable(RecyclerView recyclerView, int limit) { return Observable.create(subscriber 0-> { final RecyclerView.OnScrollListener sl = new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (!subscriber.isUnsubscribed() !&& shouldLoad()) { subscriber.onNext(recyclerView.getAdapter().getItemCount()); } } }; recyclerView.addOnScrollListener(sl); subscriber.add(Subscriptions.create(() 0-> recyclerView.removeOnScrollListener(sl))); });}

Page 250: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

172

private static Observable<Integer>getScrollObservable(RecyclerView recyclerView, int limit) { return Observable.create(subscriber 0-> { final RecyclerView.OnScrollListener sl = new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (!subscriber.isUnsubscribed() !&& shouldLoad()) { subscriber.onNext(recyclerView.getAdapter().getItemCount()); } } }; recyclerView.addOnScrollListener(sl); subscriber.add(Subscriptions.create(() 0-> recyclerView.removeOnScrollListener(sl))); });}

Page 251: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

173

private static Observable<Integer>getScrollObservable(RecyclerView recyclerView, int limit) { return Observable.create(subscriber 0-> { final RecyclerView.OnScrollListener sl = new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (!subscriber.isUnsubscribed() !&& shouldLoad()) { subscriber.onNext(recyclerView.getAdapter().getItemCount()); } } }; recyclerView.addOnScrollListener(sl); subscriber.add(Subscriptions.create(() 0-> recyclerView.removeOnScrollListener(sl))); });}

Page 252: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

174

private static Observable<Integer>getScrollObservable(RecyclerView recyclerView, int limit) { return Observable.create(subscriber 0-> { final RecyclerView.OnScrollListener sl = new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (!subscriber.isUnsubscribed() !&& shouldLoad()) { subscriber.onNext(recyclerView.getAdapter().getItemCount()); } } }; recyclerView.addOnScrollListener(sl); subscriber.add(Subscriptions.create(() 0-> recyclerView.removeOnScrollListener(sl))); });}

Page 253: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

175

private static Observable<Integer>getScrollObservable(RecyclerView recyclerView, int limit) { return Observable.create(subscriber 0-> { final RecyclerView.OnScrollListener sl = new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (!subscriber.isUnsubscribed() !&& shouldLoad()) { subscriber.onNext(recyclerView.getAdapter().getItemCount()); } } }; recyclerView.addOnScrollListener(sl); subscriber.add(Subscriptions.create(() 0-> recyclerView.removeOnScrollListener(sl))); });}

Page 254: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

176

private static Observable<Integer>getScrollObservable(RecyclerView recyclerView, int limit) { return Observable.create(subscriber 0-> { final RecyclerView.OnScrollListener sl = new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (!subscriber.isUnsubscribed() !&& shouldLoad()) { subscriber.onNext(recyclerView.getAdapter().getItemCount()); } } }; recyclerView.addOnScrollListener(sl); subscriber.add(Subscriptions.create(() 0-> recyclerView.removeOnScrollListener(sl))); });}

Page 255: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

177

getScrollObservable() .distinctUntilChanged() .switchMap(offset 0-> getLoadingObservable(offset)) .subscribeOn(Schedulers .from(BackgroundExecutor.getSafeBackgroundExecutor()) ) .observeOn(AndroidSchedulers.mainThread()) .subscribe(loadNewItemsSubscriber);

Page 256: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

178

getScrollObservable() .distinctUntilChanged() .switchMap(offset 0-> getLoadingObservable(offset)) .subscribeOn(Schedulers .from(BackgroundExecutor.getSafeBackgroundExecutor()) ) .observeOn(AndroidSchedulers.mainThread()) .subscribe(loadNewItemsSubscriber);

Page 257: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

179

getScrollObservable() .distinctUntilChanged() .switchMap(offset 0-> getLoadingObservable(offset)) .subscribeOn(Schedulers .from(BackgroundExecutor.getSafeBackgroundExecutor()) ) .observeOn(AndroidSchedulers.mainThread()) .subscribe(loadNewItemsSubscriber);

Page 258: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

180

getScrollObservable() .distinctUntilChanged() .switchMap(offset 0-> getLoadingObservable(offset)) .subscribeOn(Schedulers .from(BackgroundExecutor.getSafeBackgroundExecutor()) ) .observeOn(AndroidSchedulers.mainThread()) .subscribe(loadNewItemsSubscriber);

Page 259: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

181

getScrollObservable() .distinctUntilChanged() .switchMap(offset 0-> getLoadingObservable(offset)) .subscribeOn(Schedulers .from(BackgroundExecutor.getSafeBackgroundExecutor()) ) .observeOn(AndroidSchedulers.mainThread()) .subscribe(loadNewItemsSubscriber);

Page 260: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

182

getScrollObservable() .distinctUntilChanged() .switchMap(offset 0-> getLoadingObservable(offset)) .subscribeOn(Schedulers .from(BackgroundExecutor.getSafeBackgroundExecutor()) ) .observeOn(AndroidSchedulers.mainThread()) .subscribe(loadNewItemsSubscriber);

Page 261: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

183Думать реактивно

Page 262: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èñïîëüçîâàòü ñòàíäàðòíûå ñðåäñòâà RxJava

183Думать реактивно

Page 263: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èñïîëüçîâàòü ñòàíäàðòíûå ñðåäñòâà RxJava

• íî íå ñàáäæåêòû

183Думать реактивно

Page 264: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èñïîëüçîâàòü ñòàíäàðòíûå ñðåäñòâà RxJava

• íî íå ñàáäæåêòû

• ïðè íåîáõîäèìîñòè – ïèñàòü ñâîå

183Думать реактивно

Page 265: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èñïîëüçîâàòü ñòàíäàðòíûå ñðåäñòâà RxJava

• íî íå ñàáäæåêòû

• ïðè íåîáõîäèìîñòè – ïèñàòü ñâîå

• îáîðà÷èâàòü ñîñòîÿíèå â Observable

183Думать реактивно

Page 266: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• èñïîëüçîâàòü ñòàíäàðòíûå ñðåäñòâà RxJava

• íî íå ñàáäæåêòû

• ïðè íåîáõîäèìîñòè – ïèñàòü ñâîå

• îáîðà÷èâàòü ñîñòîÿíèå â Observable

• ñòàðàòüñÿ è íå ñäàâàòüñÿ

183Думать реактивно

Page 267: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

184The Art of Rx

Page 268: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äóìàòü î

184The Art of Rx

Page 269: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äóìàòü î

• î êîíòðàêòàõ

184The Art of Rx

Page 270: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äóìàòü î

• î êîíòðàêòàõ

• î òðåäàõ

184The Art of Rx

Page 271: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äóìàòü î

• î êîíòðàêòàõ

• î òðåäàõ

• î êîëè÷åñòâå ýëåìåíòîâ

184The Art of Rx

Page 272: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äóìàòü î

• î êîíòðàêòàõ

• î òðåäàõ

• î êîëè÷åñòâå ýëåìåíòîâ

• äóìàòü êàê

184The Art of Rx

Page 273: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äóìàòü î

• î êîíòðàêòàõ

• î òðåäàõ

• î êîëè÷åñòâå ýëåìåíòîâ

• äóìàòü êàê

• èíæåíåð

184The Art of Rx

Page 274: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

• äóìàòü î

• î êîíòðàêòàõ

• î òðåäàõ

• î êîëè÷åñòâå ýëåìåíòîâ

• äóìàòü êàê

• èíæåíåð

• ðåàêòèâíî

184The Art of Rx

Page 275: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Ñòàòü ïðîôåññèîíàëîì – íåïðîñòî

Page 276: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Íå ëåíèòåñü

Page 277: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Äóìàéòå ìíîãî

Page 278: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Äóìàéòå ìíîãî Î âàæíûõ âåùàõ

Page 279: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

189

Ìàëüêîâ Ìàòâåé

Ñïàñèáî

matveyka_jj

Page 280: The Art of Rxpublic.jugru.org/mobius/2016/spb/day_1/track_1/malkovrx.pdf · •ýíåðãîïîòðåáëåíèå • ïëàâíîñòü èíòåðôåéñà (60 fps) • ôðàãìåíòàöèÿ

Q & A