•Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about...

81
Moderne App-Architektur mit Dagger2 und RxJava code.talks 2015 Martin Breuer http://www.gedankensuppe.de/hamburg

Transcript of •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about...

Page 1: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

•Moderne App-Architektur mitDagger2 und RxJava

code.talks 2015

Martin Breuerhttp://www.gedankensuppe.de/hamburg

Page 2: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Dominik Helleberg

+DominikHelleberg

Mobile Application Development

Tools

Android / Embedded

Page 3: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Angelo Rüggeberg

+AngeloRüggeberg

Google Developer Group, Munich | Lead

Mobile Application Development

Android Enthusiast

Since Cupcake (Version 1.5)

Page 4: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Why?

App Architektur

Page 5: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

App Architektur

Page 6: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

App ArchitekturThemen

• Dependency Injection

• MV(i)P

• RxJava

Page 7: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Dependency Injection

• Your class get’s what it needs (Dependencies come

to you)

• You have no idea where they come from

• A well known pattern

• Everyone uses it (more or less)

App ArchitekturDependency Injection

Page 8: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Dependency Injection

• It’s common sense on the server side

• There are already frameworks out there:

–Spring DI

–Google Guice

–Pico Container

–...

App ArchitekturDependency Injection

Page 9: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Dependency Injection - Android

Now what about android?

• Mobile (limited ressources)

• App Startup time does really matter

• Reflection is slow

• App Size + method count does really matter

App ArchitekturDependency Injection

Page 10: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Dagger 2

Why another Framework?

• no reflection at all

• Based on Dagger1

• Proposed + Implemented by the Java Core Team (Google)

• Code generation (As if you would write it)

App ArchitekturDependency Injection

Page 11: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Dagger 2 - Basics

@Modules / @Provides

• Provide Dependencies to

@Inject

• Requests for Dependencies

@Components

• Public API, the Bridge between Modules and Injects

and some more...

App ArchitekturDependency Injection

Page 12: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Dagger2

TwitterTimeline(interface)

TwitterTimeline RestAdapter

MockTwitterTimeline

HTTPClient

App ArchitekturDependency Injection

Page 13: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Dagger2

TwitterTimeline

RestAdapter

MockTwitterTimeline

MockNetworkModule

NetworkModule

ApplicationComponent

MockApplicationComponent

App ArchitekturDependency Injection

Page 14: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

@Singleton@Component(modules = ApplicationModule.class, NetworkingModule.class)public interface ApplicationComponent

MVPComponent plus();;

App ArchitekturDependency Injection

Page 15: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

@Modulepublic class NetworkingModule

@Provides@SingletonTwitterTimeline provideTwitterTimeline(RestAdapter restAdapter) return restAdapter.create(TwitterTimeline.class);;

@Provides@Singletonpublic RestAdapter provideRestAdapter(SigningOkClient client) return TwitterApiAdapter.getInstance(client);;

App ArchitekturDependency Injection

Page 16: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

@InjectTwitterTimeline timeline;;

App ArchitekturDependency Injection

Page 17: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

@Modulepublic class MockNetworkingModule extends NetworkingModule

@Provides@SingletonTwitterTimeline provideTwitterTimeline() return new MockTwitterTimeline();;

App ArchitekturDependency Injection

Page 18: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Dagger2• DI is a good thing to have

• steep learning curve

• Sometimes hard to get hold on componentreferences

• Still under active development

• Enforces structured code

• Code generation is a good thing

App ArchitekturDependency Injection

Page 19: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Model View Presenter (MViP)

• Seperate Business Logic, Application Logic, Display Logic

• Change independent parts without Issues

• Easier to Test

–Mock Network Modules etc.

App ArchitekturMViP

Page 20: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

MViP: Components• Model

–Data that is represented

–for example Tweets

• View

–The View Displaying the Data

–can be Activity, Fragment, CustomView

• Presenter

–Logic

–for example fetching Tweets from Network

App ArchitekturMViP

Page 21: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

MVP: Components

https://blog.8thlight.com/uncle-­bob/2012/08/13/the-­clean-­architecture.html

App ArchitekturMViP

Page 22: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Example

App ArchitekturMViP

Page 23: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

App ArchitekturMViP

Activity

fetchFeed()

updateFeed(List Feed)

updateListitem(item)

onTextChanged()

Page 24: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

MViP: Model

• The Data that is displayed to the User

• Data used to do Interactions with the Presenter

• Can be the same as the Models for Network Requests

–Retrofit

App ArchitekturMViP

Page 25: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public class Tweet @JsonProperty("created_at")private String DateCreated;;@JsonProperty("id")private long Id;;@JsonProperty("text")private String Text;;@JsonProperty("user")private TwitterUser User;;

App ArchitekturMViP -­‐ Model

Page 26: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

• Interface

• Actual Display Unit Implements Interface

–Fragment, Activity, Custom View, whatever…

• Views should be dumb!

–Only react to Actions

• No Business Logic in here

MVP: View

App ArchitekturMViP

Page 27: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public interface TwitterTimelineView void showLoading();;void hideLoading();;void showFeed(List<Tweet> messages);;void showError(String errorMessage);;

App ArchitekturMViP -­‐ View

Page 28: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

class HashtagFeedActivity extends BaseActivity implementsTwitterTimelineView @Overridepublic void showLoading() …

@Overridepublic void hideLoading() …

@Overridepublic void showFeed(List<Tweet> messages) …

@Overridepublic void showError(String errorMessage) …

App ArchitekturMViP -­‐ View

Page 29: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

class HashtagFeedActivity extends BaseActivity implementsTwitterTimelineView @Overridepublic void showLoading() …

@Overridepublic void hideLoading() …

@Overridepublic void showFeed(List<Tweet> messages) …

@Overridepublic void showError(String errorMessage) …

App ArchitekturMViP -­‐ View

Page 30: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

class HashtagFeedActivity extends BaseActivity implementsTwitterTimelineView @Overridepublic void showLoading() …

@Overridepublic void hideLoading() …

@Overridepublic void showFeed(List<Tweet> messages) …

@Overridepublic void showError(String errorMessage) …

App ArchitekturMViP -­‐ View

Page 31: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Presenter

• Interface

• Binds to the View

• Business Logic in here

App ArchitekturMViP

Page 32: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public interface Presenter<T> void onDestroy();;void bindView(T view);;void unbindView();;

App ArchitekturMViP -­‐ Presenter

Page 33: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public interface TwitterHashtagTimelinePresenterextends Presenter<TwitterTimelineView>

void bindSearchView(EditText textView);;void loadHashtagTimeline(String hashtag);;void goToDetails(Activity context, Tweet t);;

App ArchitekturMViP -­‐ Presenter

Page 34: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public interface TwitterHashtagTimelinePresenterextends Presenter<TwitterTimelineView>

void bindSearchView(EditText textView);;void loadHashtagTimeline(String hashtag);;void goToDetails(Activity context, Tweet t);;

App ArchitekturMViP -­‐ Presenter

Page 35: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public class TwitterHashtagTimelinePresenterImplimplements TwitterHashtagTimelinePresenter private TwitterTimelineView view;;

@Overridepublic void bindView(TwitterTimelineView view) this.view = view;;

@Overridepublic void loadHashtagTimeline(String hashtag)

… Do Network Request ...

App ArchitekturMViP -­‐ Presenter

Page 36: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public class TwitterHashtagTimelinePresenterImplimplements TwitterHashtagTimelinePresenter private TwitterTimelineView view;;

@Overridepublic void bindView(TwitterTimelineView view) this.view = view;;

@Overridepublic void loadHashtagTimeline(String hashtag)

… Do Network Request ...

App ArchitekturMViP -­‐ Presenter

Page 37: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public class TwitterHashtagTimelinePresenterImplimplements TwitterHashtagTimelinePresenter private TwitterTimelineView view;;

@Overridepublic void bindView(TwitterTimelineView view) this.view = view;;

@Overridepublic void loadHashtagTimeline(String hashtag)

… Do Network Request ...

App ArchitekturMViP -­‐ Presenter

Page 38: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public class TwitterHashtagTimelinePresenterImplimplements TwitterHashtagTimelinePresenter private TwitterTimelineView view;;

@Overridepublic void bindView(TwitterTimelineView view) this.view = view;;

@Overridepublic void loadHashtagTimeline(String hashtag)

… Do Network Request ...

App ArchitekturMViP -­‐ Presenter

Page 39: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

@Overridepublic void loadHashtagTimeline(String hashtag) view.showLoading();;List<Tweet> tweets = interactor.loadHashtagTweets(hashtag);;view.showTweets(tweets);;view.hideLoading();;

App ArchitekturMViP -­‐ Presenter

Page 40: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

@Overridepublic void loadHashtagTimeline(String hashtag) view.showLoading();;List<Tweet> tweets = interactor.loadHashtagTweets(hashtag);;view.showTweets(tweets);;view.hideLoading();;

App ArchitekturMViP -­‐ Presenter

Page 41: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

@Overridepublic void loadHashtagTimeline(String hashtag) view.showLoading();;List<Tweet> tweets = interactor.loadHashtagTweets(hashtag);;view.showTweets(tweets);;view.hideLoading();;

App ArchitekturMViP -­‐ Presenter

Page 42: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Interactor?

• Do not bloat up Presenters!

• Interactors are used for doing things

–Fetching Stuff from the network

–Fetching Stuff from Disk

• Interface again!

App ArchitekturMViP -­‐ interactor

Page 43: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public interface TwitterTimelineInteractor void loadUserTweets(Observer<? super List<Tweet>>

observer, String username);;

void loadHashtagTweets(Observer<? super List<Tweet>> observer, String hastag);;

Observable<List<Tweet>> loadHashtagTweets(String hashtag);;

void pollHashtagTweets(Observer<? super List<Tweet>> observer, String hashtag);;

App ArchitekturMViP -­‐ interactor

Page 44: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

public class TwitterTimelineInteractorImplimplements TwitterTimelineInteractor TwitterTimeline twitterTimeline;;

@Overridepublic void loadUserTweets(Observer<? super List<Tweet>>

observer, String username) twitterTimeline

.getUserTimeline(username)

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(observer);;

App ArchitekturMViP -­‐ interactor

Page 45: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

App ArchitekturSummary

Activity

textChangeObservable

Presenter

bindView()

Adapter

showFeed()

setTweets()

loadHashtagTimelineFeedshowFeed()

Interactor

loadHashtagTimeline

Page 46: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Why?• Push don’t Poll!

–do not stress the UI

–do not stress the Application

• Avoid Lifecycle Problems

• Avoid the Callback Hell

• Death to:

–Boilerplate Code

–AsyncTasks, Timertasks, Loaders, etc...

App ArchitekturRXJava

Page 47: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

RX: What?

• Programming Paradigm based on asynchronous Data Flow

• Idea from the late 90s

• Erik Meijer (Microsoft) developed first RX extension for .NET

• Adapted by many Programming languages

App ArchitekturRXJava

Page 48: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

RX: What?

• Ported to JVM by Ben Christensen and Jafar Husain (Netflix)

–Java, Closure, Groovy, Scala, etc etc….

• RXJava -> RXAndroid

• The Observer pattern done right.

App ArchitekturRXJava

http://reactivex.io/

Page 49: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

RX: What?

App ArchitekturRXJava

Page 50: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

RXAndroid: How?

• Producing Entities:

–Observables

–Subjects

• Consuming Entities:

–Observers

–Subscribers

• Consuming Entities subscribe to Producing Entities

App ArchitekturRXJava

Page 51: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

RXAndroid: Setup

compile 'io.reactivex:rxandroid:1.0.1'//optionalcompile 'io.reactivex:rxjava:1.0.14'

App ArchitekturRXJava

Page 52: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

ObserversLifecycle:

–onNext(T):

• gets called when new Data is emited with theData

–onCompleted():

• gets called when the Sequence is done

–onError(Throwable):

• gets called when an Error occured

App ArchitekturRXJava

Page 53: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observables

• Sequence that emits data

–can emit more than once

• Lives as long as there is work to do

• Observers subscribe to an Observable

• When there is no Subscriber, the Observable emitsthe data nowhere

App ArchitekturRXJava

Page 54: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Sequence Example

Observable

Emits Something every Second

App ArchitekturRXJava

Page 55: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Sequence Example

Observable

Observer

Subscribe Unsubscribe

onNext(T);;

App ArchitekturRXJava

Page 56: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable<Long> interval = Observable.interval(1, TimeUnit.SECONDS);;

App ArchitekturRXJava

Page 57: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

interval.subscribe(new Observer<Long>() @Overridepublic void onCompleted() Timber.d("onCompleted");;

@Overridepublic void onError(Throwable e) Timber.e(e, e.getMessage());;

@Overridepublic void onNext(Long aLong) Timber.d("Tick: " + aLong.toString());;

App ArchitekturRXJava

Page 58: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Transforming the Data

• We do not want a Long as result, we want a String

• map()

–gets the Long value

–returns a String value

• Chainable!

–map().map().map().map().............map()

App ArchitekturRXJava

Page 59: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable<String> interval = Observable.interval(1, TimeUnit.SECONDS).map(new Func1<Long, String>() @Overridepublic String call(Long aLong) return "Tick: " + aLong.toString();;

);;

App ArchitekturRXJava

Page 60: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable<String> interval = Observable.interval(1, TimeUnit.SECONDS).map(new Func1<Long, String>() @Overridepublic String call(Long aLong) return "Tick: " + aLong.toString();;

);;

App ArchitekturRXJava

Page 61: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable<String> interval = Observable.interval(1, TimeUnit.SECONDS).map(new Func1<Long, String>() @Overridepublic String call(Long aLong) return "Tick: " + aLong.toString();;

);;

Returns Long

App ArchitekturRXJava

Page 62: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable<String> interval = Observable.interval(1, TimeUnit.SECONDS).map(new Func1<Long, String>() @Overridepublic String call(Long aLong) return "Tick: " + aLong.toString();;

);;

Takes the Long

Transforms the Data and returns a String

App ArchitekturRXJava

Page 63: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Hello Again Boilerplatecode

• new Func1<T, T>() public T call(t t2) … for every mapping will turn the code really unreadable and bloated

• Lambda to the Rescue!

–retrolambda for android & gradle

–https://github.com/evant/gradle-retrolambda

App ArchitekturRXJava

Page 64: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable<String> interval = Observable.interval(1, TimeUnit.SECONDS).map(new Func1<Long, String>() @Overridepublic String call(Long aLong) return "Tick: " + aLong.toString();;

);;

App ArchitekturRXJava

Page 65: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable<String> interval = Observable.interval(1, TimeUnit.SECONDS).map(aLong -­> "Tick: " + aLong.toString());;

App ArchitekturRXJava

Page 66: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable<String> interval = Observable.interval(1, TimeUnit.SECONDS).map(aLong -­> aLong.toString()).map(string -­> "Tick: " + string);;

App ArchitekturRXJava

Page 67: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Combining Observables

• Prevent Callback hell

• Easy to Synchronize for async Operations

• Running 2 Network Calls and combine theResults

• Combine onTextChanged events from two fields

• etc.

• .zip(), combineLatest()

App ArchitekturRXJava

Page 68: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable.combineLatest(WidgetObservable.text(txt1, false), WidgetObservable.text(txt2, false),(event1, event2) -­> event1.text().toString() +

event2.text().toString()).subscribe(combined -­> Timber.d(combined);;

);;

App ArchitekturRXJava

Page 69: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable.combineLatest(WidgetObservable.text(txt1, false), WidgetObservable.text(txt2, false),(event1, event2) -­> event1.text().toString() +

event2.text().toString()).subscribe(combined -­> Timber.d(combined);;

);;

App ArchitekturRXJava

Page 70: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable.combineLatest(WidgetObservable.text(txt1, false), WidgetObservable.text(txt2, false),(event1, event2) -­> event1.text().toString() +

event2.text().toString()).subscribe(combined -­> Timber.d(combined);;

);;

App ArchitekturRXJava

Page 71: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable.combineLatest(WidgetObservable.text(txt1, false), WidgetObservable.text(txt2, false),(event1, event2) -­> event1.text().toString() +

event2.text().toString()).subscribe(combined -­> Timber.d(combined);;

);;

App ArchitekturRXJava

Page 72: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Observable.combineLatest(WidgetObservable.text(txt1, false), WidgetObservable.text(txt2, false),(event1, event2) -­> event1.text().toString() +

event2.text().toString()).subscribe(combined -­> Timber.d(combined);;

);;

App ArchitekturRXJava

Page 73: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Example: Livesearch

• Retrieve the user Input from a EditText when text changes

–only after nothing changes for 600 ms

• Add # infront of the input to do a hastag search

• Call the network (via Retrofit)

–returns StatusesResponse Object

• Transform to List<Tweets>

• Show Tweets in view

App ArchitekturRXJava

Page 74: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

textChangeObservable

.observeOn(AndroidSchedulers.mainThread())

Page 75: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

textChangeObservable

.observeOn(AndroidSchedulers.mainThread())

.map(onTextChangeEvent -­> onTextChangeEvent.text().toString())

Page 76: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

textChangeObservable

.observeOn(AndroidSchedulers.mainThread())

.map(onTextChangeEvent -­> onTextChangeEvent.text().toString())

.map(searchText -­> "#" + searchText)

Page 77: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

textChangeObservable

.observeOn(AndroidSchedulers.mainThread())

.map(onTextChangeEvent -­> onTextChangeEvent.text().toString())

.map(searchText -­> "#" + searchText)

.subscribe(tag -­> Timber.d(tag);;loadHashtagTimeline(tag);;

Page 78: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

textChangeObservable

.observeOn(AndroidSchedulers.mainThread())

.map(onTextChangeEvent -­> onTextChangeEvent.text().toString())

.map(searchText -­> "#" + searchText)

.subscribe(tag -­> Timber.d(tag);;loadHashtagTimeline(tag);;

,e -­> Timber.e(e, e.getMessage());;view.showError(e.getMessage());;

);;

Page 79: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

textChangeObservable.debounce(600, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).map(onTextChangeEvent -­> onTextChangeEvent.text().toString()).map(searchText -­> "#" + searchText).subscribe(

tag -­> Timber.d(tag);;loadHashtagTimeline(tag);;

,e -­> Timber.e(e, e.getMessage());;view.showError(e.getMessage());;

);;

Page 80: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Demo

Page 81: •Moderne App-Architektur mit Dagger2 und RxJava · DependencyInjection- Android Now what about android? • Mobile (limited ressources) • App Startup time does really matter •

Thank You!