Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reactive Architecture Android Meetup

HIFILEO
February 06, 2018

Reactive Architecture Android Meetup

Reactive Architecture is nothing more than the combination of reactive programming and software architectures. Also known as reactive systems, the goal is to make the system responsive, resilient, elastic, and message driven. Reactive Architecture is simple but not easy.

HIFILEO

February 06, 2018
Tweet

More Decks by HIFILEO

Other Decks in Technology

Transcript

  1. Kudos • Managing State with RxJava - Jack Wharton •

    The Rx Workflow Problem - Ray Ryan • Reactive Clean Architecture - Lucia Payo • Don’t Break The Chain - Dan Lew
  2. Goal • Define it • History Lesson • Rx Problems

    & Solution • Think in Images, Dream in Code
  3. MVVM Rx Problem Unless you can model your entire system

    synchronously, a single asynchronous source breaks imperative programming. Jake Wharton - Managing State with Rx
  4. MVVM Rx Problem .doOnNext(loadMoreCommand -> { loadMoreEnabledBehaviorSubject.onNext(false); if (loadMoreCommand.getLoadMoreType() ==

    SCROLL) { adapterDataPublishSubject.onNext(AdapterUiCommand.createAddNull()); movieViewInfoList.add(null); } } }) .observeOn(Schedulers.computation()) .flatMap(loadMoreCommand -> serviceGateway.getNowPlaying(++pageNumber)) .delay(sleepSeconds, TimeUnit.SECONDS) .flatMap(new NowPlayingViewModel.MovieListFetcher()) .flatMap(new TranslateForUiFunction()) .doOnError(throwable -> pageNumber--;) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(movieViewInfos -> { if (!firstLoad.get()) { movieViewInfoList.remove(movieViewInfoList.size() - 1); adapterDataPublishSubject.onNext(AdapterUiCommand.createRemoveNull()); } }) .onErrorResumeNext(movieViewInfos -> { showErrorPublishSubject.onNext(true); loadMorePublishSubject.onNext(new LoadMoreCommand(SCROLL)); }) .subscribe(movieViewInfos -> { movieViewInfoList.addAll(movieViewInfos); adapterDataPublishSubject.onNext( new AdapterUiCommand(AdapterUiCommand.CommandType.ADD, movieViewInfos)); //address first load //… //enable scroll }
  5. Deep Dive • As a user, show a list of

    "Now Playing" movies. Poster, Title, Release Date, & Rating. • As a user, any rating at eight or above should be stared. • As a user, I only want to see ratings rounded to the nearest whole digit. • As a user, while scrolling, keep loading "Now Playing" movies until you hit the last page. • Example #1
  6. Deeper Dive • New requirement • As a user, restore

    the last page I was on when the "Now Playing" screen restarts. • Example #2
  7. We Need To Go Deeper • New Requirement • As

    a user, I want to filter my results based on Rating. • Note - Filter at any moment.
  8. { We Need To Go Deeper Concat + Publish Filter

    Result Filter On / Off }Observable.merge<Result>
  9. We Need To Go Deeper • So let’s look at

    code for the: New Requirement • Example #3
  10. Summary • Managing State with Rx • Remember (Like Redux)

    • Save State using UiModel • Don’t break the stream • Do you need a subject? • Speed Increase + Quality Increase