GKAC 2014 Nov. - RxJava를 활용한 Functional Reactive Programming

58
안드로이드 동시성 프로그래밍 - RxJava를 활용한 Functional Reactive Programming 최정열 / Sivaworks / 라 스칼라 코딩단 조현태 / 라 스칼라 코딩단 / [email protected]

description

GDG Korea Android Conference (11월) 세션 자료입니다. 세션 영상: http://www.youtube.com/watch?v=VIoTmuwRsH0

Transcript of GKAC 2014 Nov. - RxJava를 활용한 Functional Reactive Programming

2. RxJAVA?! 3. RxJava? Excel - . A B C 1 2 10 20 = A1+A230 4. RxJava? Event Three - 5. Observable - () Observer - () RxJava - Observable, Observer? Button Network Keyboard Alert Image View Text View Image Error Input Text Observable Observer String Byte[] Click String Visibility Image Event 6. Observable - () - subscribe , . Observer - () - Observable onNext, onError, onCompelete . RxJava - Observable, Observer? OnNext OnComplete OnError 7. RxJava - Observable, Observer? eventSource.subscribe((event)-> { // observer } }); Observable Observer 8. - TextView RxJava - map EditText Function TextView Text B fun(x) TextB-1 Text C fun(x) TextC-1 Text A fun(x) TextA-1 9. map - RxJava - map eventSource.map((value) -> fun(value)) Value1 Value2 fun(x) 10. map - RxJava - map buttonClick .map((value) -> {return fly(value);}) .subscribe(); buttonClick.setOnClickListener( (v) -> {value.fly();} ); 11. - RxJava - flatMap EditText Async Function TextView fun(x) TextA-1 Text A fun(x) TextB-1 Text B fun(x) TextC-1 Text C 12. flatmap - 0 ~ n . RxJava - flatMap eventSource.flatMap((value) -> {return longlongFunc(value);}) .subscribe((Result) -> { // show result. }); Observable 13. flatmap - . RxJava - flatMap confirmBtnClickEvent.flatMap((value) -> { return userId.flatMap((userId) -> { return login(userId); }); }).subscribe((Result) -> { // show result. }); Push Pull 14. flatmap - . RxJava - flatMap confirmBtnClickEvent.flatMap((value) -> { return startupEngine(); }).flatMap((value) -> { return setupWings(); }).flatMap((value) -> { return takeOff(); }).subscribe((Result) -> { // show result. }); 15. 16. combineLatest - Observable . RxJava - combineLatest, merge Observable.combineLatest( (altitude, latitude, longitude) -> { getDirection(altitude, latitude, longitude); } ); 17. combineLatest - Observable . RxJava - combineLatest, merge 1 combineLatest( ) 2 2 3 3 4 4 18. take off - . - . - 1 Status GREEN . landing - . - . - 1 Status RED . RxJava - combineLatest, merge , . 19. switchMap - Observable Observable . RxJava - combineLatest, merge engine switchMap( )remoteControl altitude On Off landing On On Off 20. switchMap - Observable Observable . RxJava - combineLatest, merge receivedEvent.switchMap(remoteEventType -> { switch (remoteEventType) { case LANDING: return Observable.zip( setupAltitude(0), setupSpeed(0), (event1, event2) -> null) .flatMap(event -> setupEngine(0)); case TAKE_OFF: return setupEngine(100).flatMap( event -> Observable.zip( setupAltitude(100), setupSpeed(100), (event1, event2) -> null) ); } 21. Thread 22. - RxJava - Scheduler UI Thread IO Thread UI Thread Click Image Image 23. subscribeOn - observeOn - . RxJava - Scheduler ClickEvents.flatMap((event) -> asyncDownloadImage(params).subscribeOn(Schedulers.io()); ) .observeOn(AndroidSchedulers.mainThread()) .subscribe((image) -> { // show result. }); 24. observeOn - . RxJava - Scheduler Event observeOn(MainThreadScheduler) Main Thread Thread 25. subscribeOn - . RxJava - Scheduler subscribeOn(IOThreadScheduler) IO Thread Event IO Thread 26. - RxJava - Scheduler Observable request = // .observeOn(Schedulers.from(Executors.newSingleThreadExecutor()) .subscribe(Action0::call); Task Single Thread TaskTask Task Thread 1 Thread 2 Task Task 27. 28. ) delay - RxJava - Time // Text 1 . inputText.delay(1, TimeUnit.SECONDS) .subscribe(new SetTextAction(textView)); 29. delay - . RxJava - Time 21 3 Observer 1 2 3 delay( ) 30. throttleFirst - . RxJava - Time Observer throttleFirst( ) 1 1 3 3 5 5 2 4 31. throttleWithTimeout - . RxJava - Time Observer throttleWithTimeout( ) 1 2 43 1 4 32. 33. retry - . RxJava - Error Handling GetDataFromNetwork() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()()) .subscribe( (img) -> {showImage(img);}, (e) -> {showError(e);}, () -> {showComplete();} ) 1 Observer 1 X Error Handling 34. retry - . RxJava - Error Handling GetDataFromNetwork() .subscribeOn(Schedulers.io()) .retry() Observer retry() 1 1 X 3 3 35. retry(int n) - n . RxJava - Error Handling GetDataFromNetwork() .subscribeOn(Schedulers.io()) .retry(1) Observer retry(1) 1 1 X 2 2 X X 36. retryWhen(Observable) - . RxJava - Error Handling Observer retryWhen() 1 1 X 3 3 delay(3, SECODS) GetDataFromNetwork() .subscribeOn(Schedulers.io()) .retryWhen((observable) -> { // 3 return observable.delay(3, TimeUnit.SECONDS); }) 37. Map , FlatMap ? - , RxJava - Map? FlatMap? click func save map() map() retry() 38. Map , FlatMap ? - , RxJava - Map? FlatMap? click func save map() flatMap() retry() 39. MVVM With RxJava 40. Loading Indicator Loading indicator . RxJava - MVVM // Observable btnClickEvent = Observable.merge( btnClickEvent.map((event) -> true), btnClickEvent.flatMap((event)-> downloadFunction().subscribeOn(Schedulers.io()) ).map((event) -> false).observeOn(AndroidSchedulers.main()) .subscribe((isVisible) -> { v.setVisibility(isVisible ? View.VISIBLE : View.GONE); )} View Model View 41. RxJava - MVVM User Info Login Info Profile Image Alert Image View Text View Image Error Input Text Model View Image String String String Visibility Image Event View Model 42. RxJava - MVVM User Info Login Info Profile Image Alert Image View Text View Image Error Input Text Model View Image String String String Visibility Image Event View Model 43. - Thread public class SchedulerManager { private static Scheduler main = AndroidSchedulers.mainThread(); private static Scheduler io = Schedulers.io(); public static Scheduler main() { return main; } public static Scheduler io() { return io; } } Scheduler . 44. - Thread @Override protected void setUp() throws Exception { super.setUp(); testScheduler = Schedulers.test(); SchedulerManager.setMain(testScheduler); SchedulerManager.setIO(testScheduler); } , Scheduler . 45. - Thread ArrayList testResults = new ArrayList(); remoteAirplaneModel.statusText.subscribe(testResults::add); mainActivityModel.takeoffBtn.emit(); assertEquals(1, testResults.size()); testScheduler.advanceTimeBy(2, TimeUnit.SECONDS); assertEquals(2, testResults.size()); 46. - Thread testScheduler.advanceTimeBy(2, TimeUnit.SECONDS)Thread 1 Event Event Thread 2 ArrayList testResults = new ArrayList(); remoteAirplaneModel.statusText.subscribe(testResults::add); mainActivityModel.takeoffBtn.emit(); assertEquals(1, testResults.size()); testScheduler.advanceTimeBy(2, TimeUnit.SECONDS); assertEquals(2, testResults.size()); 47. 48. Observable -> Observer Subscribe - side effect .. RxJava - Memory source Custom Action1 Function Custom Action2 49. Observable -> Observer Subscribe - side effect .. RxJava - Memory Observable o = Observable.from(Arrays.asList(0, 1, 2, 3, 4)); Observable sumObservable = o.map(new Func1() int sum = 0; @Override public Integer call(Integer integer) { sum += integer; return sum; } }); sumObservable.subscribe(System.out::println); sumObservable.subscribe(System.out::println); 0 1 3 6 10 10 11 13 16 20 50. cache() - cache . RxJava - Memory source Custom Action1 Function Custom Action2 cache Relplay Subject 51. Observable -> Observer Subscribe - side effect .. RxJava - Memory Observable o = Observable.from(Arrays.asList(0, 1, 2, 3, 4)); Observable sumObservable = o.map(new Func1() int sum = 0; @Override public Integer call(Integer integer) { sum += integer; return sum; } }).cache(); sumObservable.subscribe(System.out::println); sumObservable.subscribe(System.out::println); 0 1 3 6 10 0 1 3 6 10 52. cache(n) - n cache . RxJava - Memory source Custom Action1 Function Custom Action2 cache(n) Relplay Subject(n) 53. onCreate / onDestroy - onCreate subscribe onCompelete . RxJava - Memory Subscription subscribe; @Override protected void onCreate(Bundle savedInstanceState) { subscribe = observable.subscribe(new Action1() { @Override public void call(T aT) { // Activity Reference this$0 } }); } @Override protected void onDestroy() { subscribe.unsubscribe(); } 54. onCreate / onDestroy - onCreate subscribe onCompelete . RxJava - Memory observable Subscription Activity or View subscribe() new Action1() 55. 56. - Event, Thread, , Exception Callback . - . . - . - . - . Reactive Programming ? Event, Thread, Time, Exception Observable 57. . - View, Activity . - View . Reactive Programming ? MVVM OS 58. .