SlideShare a Scribd company logo
Reactive programming on 
Android 
Tomáš Kypta
What’s reactive programming? 
reactive programming or functional reactive 
programming (FRP)
What’s reactive programming? 
functional 
– lambdas 
– closures 
– pure 
– composable 
reactive 
– data flow 
– asynchronous 
– values 
– events 
– push
Reactive? 
• observer pattern
Typical App 
Event Source 
Views Network DB Other 
Listener Listener Listener Listener 
logic logic logic logic 
State
Views Network DB 
Transformation 
Reactive 
Event Source 
Other 
Observable Observable Observable Observable 
Observer Observer
Reactive 
• abstract away from concerns about 
– low-level threading 
– side effects 
– synchronization 
– encapsulation 
– resource management
Java 8 
Observable.toObservable(“a”, “b”, “c”) 
.take(2) 
.subscribe((arg) -> { 
System.out.println(arg); 
}); 
Reactive Code
Reactive on Android 
• evading callback hell 
• How to execute heavy tasks on 
background threads? 
• And deliver results on the main (UI) 
thread?
Async on Android
Handler handler = new Handler(); 
new Thread(){ 
@Override 
public void run() { 
final String result = somethingDemanding(); 
handler.post(new Runnable() { 
@Override 
public void run() { 
showResult(result); 
} 
}); 
} 
}.start(); 
Thread + Handler
Handler handler = new Handler(); 
new Thread(){ 
@Override 
public void run() { 
final String result = somethingDemanding(); 
handler.post(new Runnable() { 
@Override 
public void run() { 
showResult(result); 
} 
}); 
} 
}.start(); 
Thread + Handler
Thread + Handler 
• simple 
• difficult to deliver on the main thread 
• broken data flow
new AsyncTask<Void, Integer, String>(){ 
@Override 
protected String doInBackground(Void... 
params) { 
return somethingDemanding(); 
} 
@Override 
protected void onPostExecute(String s) { 
showResult(s); 
} 
}.execute(); 
AsyncTask
AsyncTask 
• deals with the main thread 
• error-prone 
• difficult error propagation 
• difficult to bound to activity/fragment 
lifecycle 
• difficult composition
class MyFragment extends Fragment implements 
LoaderManager.LoaderCallbacks<String> { 
@Override public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
getLoaderManager().initLoader(42, null, this); 
} 
@Override public Loader<String> onCreateLoader(int id, Bundle args) { 
return new AsyncTaskLoader<String>(getActivity()) { 
@Override public String loadInBackground() { 
return doHeavyTask(); 
} 
}; 
} 
@Override public void onLoadFinished(Loader<String> loader, String data) { 
showResult(data); 
} 
@Override public void onLoaderReset(Loader<String> loader) {} 
} 
Loaders
Loaders
Loaders 
• boilerplate 
• good for cursors 
• deals with activity/fragment lifecycle 
• difficult composition 
• difficult to adjust logic
Async on Android 
• many other async libraries 
– some are better 
– some are worse
RxJava
RxJava 
• Java VM implementation of Reactive 
Extensions 
• a library for composing flows and 
sequences of asynchronous data 
• open-source 
• https://github.com/ReactiveX/RxJava 
• by Netflix
RxJava 
• DSL for creating computation flows from 
async sources 
• flows called Observables 
• push semantics of Observables
RxJava … not sure if …
Future 
proxy or wrapper around an object that is not 
yet there 
future.get() 
future.isDone() 
• non-trivial complexity when nested 
• difficult to compose conditional 
asynchronous execution flows
Iterable vs. Observable
Iterable vs. Observable 
// Iterable<String> 
getData() 
.skip(10) 
.take(5) 
.map({s -> 
return s + “1”}) 
.forEach({ 
println it 
}); 
// Observable<String> 
getData() 
.skip(10) 
.take(5) 
.map({s -> 
return s + “1”}) 
.subscribe({ 
println it 
});
Iterable vs. Observable 
single items multiple items 
synchronous T getData() Iterable<T> getData() 
asynchronous Future<T> getData() Observable<T> getData()
Iterable vs. Observable 
event Iterable (pull) Observable (push) 
retrieve data T next() onNext(T) 
discover error throws Exception onError(Exception) 
complete !hasNext() onCompleted()
Observable 
Calling Thread 
public Observable<String> getData(); 
Callback Thread 
synchronous on calling thread
Observable 
Calling Thread 
public Observable<String> getData(); 
Callback Thread 
Thread Pool 
asynchronous on a separate thread
Observable 
Calling Thread 
public Observable<String> getData(); 
Callback Threads 
Thread Pool 
asynchronous on multiple threads
Observable 
• not biased toward some particular source 
of asynchronicity 
• the implementation chooses if the code will 
be blocking or non-blocking
public interface Observer <T> { 
void onCompleted(); 
void onError(Throwable throwable); 
void onNext(T t); 
} 
Observable
public Observable<String> getStrings() { 
return Observable.create(new Observable.OnSubscribe<String>() { 
@Override 
public void call(Subscriber<? super String> subscriber) { 
try { 
subscriber.onNext("Hello"); 
subscriber.onNext("World"); 
subscriber.onCompleted(); 
} catch (Exception ex) { 
subscriber.onError(ex); 
} 
} 
}); 
} 
Observable
Observable<String> strings = getStrings(); 
strings.subscribe( 
new Observer<String>() { 
@Override 
public void onCompleted() { 
Log.d("rx", "no more data"); 
} 
@Override 
public void onError(Throwable throwable) { 
Log.e(“rx”, “error”, throwable); 
} 
@Override 
public void onNext(String s) { 
showResult(s); 
} 
}); 
Observer
Observable<String> strings = getStrings(); 
strings.subscribe( 
new Observer<String>() { 
@Override 
public void onCompleted() { 
Log.d("rx", "no more data"); 
} 
@Override 
public void onError(Throwable throwable) { 
Log.e(“rx”, “error”, throwable); 
} 
@Override 
public void onNext(String s) { 
showResult(s); 
} 
}); 
Observer
Observable<String> strings = getStrings(); 
strings.subscribe( 
new Observer<String>() { 
@Override 
public void onCompleted() { 
Log.d("rx", "no more data"); 
} 
@Override 
public void onError(Throwable throwable) { 
Log.e(“rx”, “error”, throwable); 
} 
@Override 
public void onNext(String s) { 
showResult(s); 
} 
}); 
Observer
Observable<String> strings = getStrings(); 
strings.subscribe( 
new Observer<String>() { 
@Override 
public void onCompleted() { 
Log.d("rx", "no more data"); 
} 
@Override 
public void onError(Throwable throwable) { 
Log.e(“rx”, “error”, throwable); 
} 
@Override 
public void onNext(String s) { 
showResult(s); 
} 
}); 
Observer
Observable<String> strings = getStrings(); 
Subscription subsctiption = strings.subscribe( 
new Observer<String>() { 
@Override 
public void onCompleted() { 
Log.d("rx", "no more data"); 
} 
@Override 
public void onError(Throwable throwable) { 
Log.e(“rx”, “error”, throwable); 
} 
@Override 
public void onNext(String s) { 
showResult(s); 
} 
}); 
Observer
Subscription 
Subscription subsctiption; 
subscription.unsubscribe(); 
subscription.isUnsubscribed();
Android & RxJava
RxAndroid 
Android specific things for Rx 
• Scheduler 
• reliable and thread-safe with regarding 
Fragment/Activity life-cycle 
• reactive components for Android use cases 
and UI
RxAndroid 
• https://github.com/ReactiveX/RxAndroid 
• 'io.reactivex:rxandroid:0.23.0' 
• formerly rxjava-android
Image Loading 
Observable<Bitmap> imageObservable = 
Observable.create(observer -> { 
return downloadBitmap(); 
}); 
imageObservable 
.subscribe(image -> loadToImageView(image));
Image Loading 
Observable<Bitmap> imageObservable = 
Observable.create(observer -> { 
return downloadBitmap(); 
}); 
imageObservable 
.subscribe(image -> loadToImageView(image));
Image Loading 
imageObservable 
.subscribeOn(Schedulers.newThread()) 
.subscribe(image -> loadToImageView(image));
Image Loading 
imageObservable 
.subscribeOn(Schedulers.newThread()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(image -> loadToImageView(image));
Image Loading 
imageObservable 
.subscribeOn(Schedulers.newThread()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(image -> loadToImageView(image));
public void onDestroy() { 
super.onDestroy(); 
subscription.unsubscribe(); 
} 
Lifecycle & Memory Leaks
Fragment/Activity Lifecycle 
ContentObservable 
.bindFragment(fragment, observable); 
ContentObservable 
.bindActivity(activity, observable);
Broadcast Receiver 
Observable<Intent> observable = 
ContentObservable 
.fromBroadcast(context, intentFilter); 
Observable<Intent> observable = 
ContentObservable 
.fromLocalBroadcast(context, intentFilter);
Views 
Observable<OnClickEvent> observable = 
ViewObservable.clicks(view); 
ViewObservable 
.bindView(view, observable);
Creating Observables
Creating Observables 
• manually from scratch 
create()
Creating Observables 
• convert existing data structure into an 
Observable 
from() 
– Iterable, Future, Array 
repeat() 
– emit source Observable repeatedly
Creating Observables 
• convert existing data structure into an 
Observable 
timer() 
– emits a single item after a given time
Creating Observables 
• convert existing data structure into an 
Observable 
empty() 
– emits nothing and completes 
error() 
– emits nothing and signals an error 
never() 
– emits nothing at all
Obervables are composable 
transform - map, flatMap, reduce, scan 
filter - take, skip, sample, filter 
combine - concat, merge, zip, cache 
concurrency - observeOn, subcribeOn 
error handling - onErrorReturn
Transforming Observables
Transforming Observables 
map() 
– apply a function to each item
Transforming Observables 
flatMap() 
– transform items into Observables and 
flatten
Transforming Observables 
scan() 
– apply a function to each item 
sequentially and emit each successive 
value
Transforming Observables 
groupBy() 
– divide into a set of Observables
Transforming Observables 
buffer() 
– periodically gather items into bundles 
and emits these bundles
Filtering Observables
Filtering Observable 
filter() 
– filter emitted items
Filtering Observable 
take() 
– emit only first n items
Filtering Observable 
timeout() 
– emit items, but issue an exception if 
nothing emitted in a timespan
Filtering Observable 
distinct() 
– suppress duplicate items
Filtering Observable 
takeLastBuffer() 
first() 
elementAt() 
– emit only n-th element 
ignoreElements() 
– pass only error or completed
Combining Observables
Combining Observables 
merge() 
– combine multiple Observables
Combining Observables 
zip() 
– combine multiple Observables via a 
function, emit results of the function
Error Handling
Error Handling 
recovering from onError() 
onErrorResumeNext() 
– emit a sequence if error happens
Error Handling 
onErrorReturn() 
– emit an item if error happens
Error Handling 
retry() 
– resubscribe to a source
Support for RxJava in other 
libraries
Retrofit 
@GET("/user/{id}/photo") 
Observable<Photo> getUserPhoto(@Path("id") int id);
private Object simpleMethod() { ... } 
public Observable<Object> newMethod() { 
return Observable.just(simpleMethod()); 
} 
Plain old library
private Object simpleMethod() { ... } 
public Observable<Object> newMethod() { 
return Observable.defer(() -> 
Observable.just(simpleMethod()) 
); 
} 
Plain old library
Java 8 & Android 
No lambdas on Android 
– use different language on Android 
– or rather not
Retrolambda 
transforms Java 8 compiled bytecode for 
older JVM 
• gradle-retrolambda 
– https://github.com/evant/gradle-retrolambda 
– 'me.tatarka:gradle-retrolambda:2.4.1' 
• retrolambda 
– https://github.com/orfjackal/retrolambda
strings.map(new Func1<String, Integer>() { 
@Override 
public Integer call(String s) { 
return s.length(); 
} 
}); 
Without Retrolambda
strings.map( 
(String s) -> { return s.length(); } 
); 
With Retrolambda
Problems 
• RxAndroid APIs not yet stabilized even 
though RxJava hitting version 1.0 
– RxAndroid version 0.23 
• backpressure
Questions?
THE END

More Related Content

PDF
PSUG #52 Dataflow and simplified reactive programming with Akka-streams
PDF
Distributed Real-Time Stream Processing: Why and How 2.0
PPTX
Developing a Real-time Engine with Akka, Cassandra, and Spray
PDF
Arbitrary Stateful Aggregations using Structured Streaming in Apache Spark
PDF
Easy, scalable, fault tolerant stream processing with structured streaming - ...
PPTX
Modus operandi of Spark Streaming - Recipes for Running your Streaming Applic...
ODP
Meet Up - Spark Stream Processing + Kafka
PDF
Productionizing your Streaming Jobs
PSUG #52 Dataflow and simplified reactive programming with Akka-streams
Distributed Real-Time Stream Processing: Why and How 2.0
Developing a Real-time Engine with Akka, Cassandra, and Spray
Arbitrary Stateful Aggregations using Structured Streaming in Apache Spark
Easy, scalable, fault tolerant stream processing with structured streaming - ...
Modus operandi of Spark Streaming - Recipes for Running your Streaming Applic...
Meet Up - Spark Stream Processing + Kafka
Productionizing your Streaming Jobs

What's hot (20)

PPT
Spark stream - Kafka
PPTX
Deep Dive with Spark Streaming - Tathagata Das - Spark Meetup 2013-06-17
PDF
Easy, scalable, fault tolerant stream processing with structured streaming - ...
PDF
Event sourcing - what could possibly go wrong ? Devoxx PL 2021
PPTX
Apache Beam: A unified model for batch and stream processing data
PDF
Automated Spark Deployment With Declarative Infrastructure
PDF
Deep Dive into Stateful Stream Processing in Structured Streaming with Tathag...
PDF
Harnessing the power of YARN with Apache Twill
PDF
Distributed Stream Processing - Spark Summit East 2017
PPTX
Flink Forward SF 2017: David Hardwick, Sean Hester & David Brelloch - Dynami...
PPTX
Introduction to rx java for android
PDF
Spark streaming: Best Practices
PDF
Robust Operations of Kafka Streams
PDF
Deep dive into stateful stream processing in structured streaming by Tathaga...
PDF
Modernizing Infrastructures for Fast Data with Spark, Kafka, Cassandra, React...
PDF
Build Real-Time Streaming ETL Pipelines With Akka Streams, Alpakka And Apache...
PPTX
Flink 0.10 @ Bay Area Meetup (October 2015)
PPTX
Building production spark streaming applications
PDF
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...
PDF
Data processing platforms architectures with Spark, Mesos, Akka, Cassandra an...
Spark stream - Kafka
Deep Dive with Spark Streaming - Tathagata Das - Spark Meetup 2013-06-17
Easy, scalable, fault tolerant stream processing with structured streaming - ...
Event sourcing - what could possibly go wrong ? Devoxx PL 2021
Apache Beam: A unified model for batch and stream processing data
Automated Spark Deployment With Declarative Infrastructure
Deep Dive into Stateful Stream Processing in Structured Streaming with Tathag...
Harnessing the power of YARN with Apache Twill
Distributed Stream Processing - Spark Summit East 2017
Flink Forward SF 2017: David Hardwick, Sean Hester & David Brelloch - Dynami...
Introduction to rx java for android
Spark streaming: Best Practices
Robust Operations of Kafka Streams
Deep dive into stateful stream processing in structured streaming by Tathaga...
Modernizing Infrastructures for Fast Data with Spark, Kafka, Cassandra, React...
Build Real-Time Streaming ETL Pipelines With Akka Streams, Alpakka And Apache...
Flink 0.10 @ Bay Area Meetup (October 2015)
Building production spark streaming applications
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...
Data processing platforms architectures with Spark, Mesos, Akka, Cassandra an...
Ad

Viewers also liked (13)

PPTX
xPatterns on Spark, Shark, Mesos, Tachyon
PDF
Reactive streams
PDF
Reactive Jersey Client
PDF
A Journey to Reactive Function Programming
PDF
Akka in Practice: Designing Actor-based Applications
PPTX
Reactive Streams and RabbitMQ
PDF
Akka and AngularJS – Reactive Applications in Practice
PDF
Docker. Does it matter for Java developer ?
PDF
Tachyon and Apache Spark
PDF
Resilient Applications with Akka Persistence - Scaladays 2014
PPTX
xPatterns ... beyond Hadoop (Spark, Shark, Mesos, Tachyon)
PPTX
Micro services, reactive manifesto and 12-factors
PDF
12 Factor App: Best Practices for JVM Deployment
xPatterns on Spark, Shark, Mesos, Tachyon
Reactive streams
Reactive Jersey Client
A Journey to Reactive Function Programming
Akka in Practice: Designing Actor-based Applications
Reactive Streams and RabbitMQ
Akka and AngularJS – Reactive Applications in Practice
Docker. Does it matter for Java developer ?
Tachyon and Apache Spark
Resilient Applications with Akka Persistence - Scaladays 2014
xPatterns ... beyond Hadoop (Spark, Shark, Mesos, Tachyon)
Micro services, reactive manifesto and 12-factors
12 Factor App: Best Practices for JVM Deployment
Ad

Similar to Reactive programming on Android (20)

PDF
Reactive programming on Android
PPTX
Reactive programming with RxAndroid
PPTX
Rxandroid
PPTX
RxAndroid
PPTX
Reactive Programming on Android - RxAndroid - RxJava
PDF
Streamlining with rx
PDF
RxJava in practice
PDF
RxJava@DAUG
PDF
RxJava@Android
PDF
The Mayans Lost Guide to RxJava on Android
PDF
RxJava pour Android : présentation lors du GDG Android Montréal
PPTX
RxJava2 Slides
PPTX
Intro to Functional Programming with RxJava
PPTX
Intro to Reactive Thinking and RxJava 2
PDF
Reactive Functional Programming with Java 8 on Android N
PPTX
Reactive Programming on Android
PDF
Iniciación rx java
PDF
Reactive Programming in Java by Mario Fusco - Codemotion Rome 2015
PDF
Reactive Programming for a demanding world: building event-driven and respons...
PDF
RxJava и Android. Плюсы, минусы, подводные камни
Reactive programming on Android
Reactive programming with RxAndroid
Rxandroid
RxAndroid
Reactive Programming on Android - RxAndroid - RxJava
Streamlining with rx
RxJava in practice
RxJava@DAUG
RxJava@Android
The Mayans Lost Guide to RxJava on Android
RxJava pour Android : présentation lors du GDG Android Montréal
RxJava2 Slides
Intro to Functional Programming with RxJava
Intro to Reactive Thinking and RxJava 2
Reactive Functional Programming with Java 8 on Android N
Reactive Programming on Android
Iniciación rx java
Reactive Programming in Java by Mario Fusco - Codemotion Rome 2015
Reactive Programming for a demanding world: building event-driven and respons...
RxJava и Android. Плюсы, минусы, подводные камни

More from Tomáš Kypta (20)

PDF
Modern Android app library stack
PDF
Guide to the jungle of testing frameworks
PDF
Guide to the jungle of testing frameworks
PDF
Practical RxJava for Android
PDF
Practical RxJava for Android
PDF
Android Develpment vol. 3, MFF UK, 2015
PDF
Writing testable Android apps
PDF
Android Develpment vol. 2, MFF UK, 2015
PDF
ProGuard
PDF
Unit testing and Android
PDF
Android Development for Phone and Tablet
PDF
Android development - the basics, MFF UK, 2014
PDF
Android Libraries
PDF
Android Development 201
PDF
Android development - the basics, MFF UK, 2013
PDF
Užitečné Android knihovny pro vývoj a testování
PDF
Programování pro Android - úvod, FI MUNI, 2013
PDF
Stylování ActionBaru
PDF
Android development - the basics, MFF UK, 2012
PDF
Android development - the basics, FI MUNI, 2012
Modern Android app library stack
Guide to the jungle of testing frameworks
Guide to the jungle of testing frameworks
Practical RxJava for Android
Practical RxJava for Android
Android Develpment vol. 3, MFF UK, 2015
Writing testable Android apps
Android Develpment vol. 2, MFF UK, 2015
ProGuard
Unit testing and Android
Android Development for Phone and Tablet
Android development - the basics, MFF UK, 2014
Android Libraries
Android Development 201
Android development - the basics, MFF UK, 2013
Užitečné Android knihovny pro vývoj a testování
Programování pro Android - úvod, FI MUNI, 2013
Stylování ActionBaru
Android development - the basics, MFF UK, 2012
Android development - the basics, FI MUNI, 2012

Recently uploaded (20)

PDF
Modernizing your data center with Dell and AMD
PDF
cuic standard and advanced reporting.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Electronic commerce courselecture one. Pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
Big Data Technologies - Introduction.pptx
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Approach and Philosophy of On baking technology
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
KodekX | Application Modernization Development
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Modernizing your data center with Dell and AMD
cuic standard and advanced reporting.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
Electronic commerce courselecture one. Pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
The AUB Centre for AI in Media Proposal.docx
Network Security Unit 5.pdf for BCA BBA.
Big Data Technologies - Introduction.pptx
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Approach and Philosophy of On baking technology
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
20250228 LYD VKU AI Blended-Learning.pptx
NewMind AI Weekly Chronicles - August'25 Week I
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Chapter 3 Spatial Domain Image Processing.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
KodekX | Application Modernization Development
Spectral efficient network and resource selection model in 5G networks
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...

Reactive programming on Android

  • 1. Reactive programming on Android Tomáš Kypta
  • 2. What’s reactive programming? reactive programming or functional reactive programming (FRP)
  • 3. What’s reactive programming? functional – lambdas – closures – pure – composable reactive – data flow – asynchronous – values – events – push
  • 5. Typical App Event Source Views Network DB Other Listener Listener Listener Listener logic logic logic logic State
  • 6. Views Network DB Transformation Reactive Event Source Other Observable Observable Observable Observable Observer Observer
  • 7. Reactive • abstract away from concerns about – low-level threading – side effects – synchronization – encapsulation – resource management
  • 8. Java 8 Observable.toObservable(“a”, “b”, “c”) .take(2) .subscribe((arg) -> { System.out.println(arg); }); Reactive Code
  • 9. Reactive on Android • evading callback hell • How to execute heavy tasks on background threads? • And deliver results on the main (UI) thread?
  • 11. Handler handler = new Handler(); new Thread(){ @Override public void run() { final String result = somethingDemanding(); handler.post(new Runnable() { @Override public void run() { showResult(result); } }); } }.start(); Thread + Handler
  • 12. Handler handler = new Handler(); new Thread(){ @Override public void run() { final String result = somethingDemanding(); handler.post(new Runnable() { @Override public void run() { showResult(result); } }); } }.start(); Thread + Handler
  • 13. Thread + Handler • simple • difficult to deliver on the main thread • broken data flow
  • 14. new AsyncTask<Void, Integer, String>(){ @Override protected String doInBackground(Void... params) { return somethingDemanding(); } @Override protected void onPostExecute(String s) { showResult(s); } }.execute(); AsyncTask
  • 15. AsyncTask • deals with the main thread • error-prone • difficult error propagation • difficult to bound to activity/fragment lifecycle • difficult composition
  • 16. class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks<String> { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLoaderManager().initLoader(42, null, this); } @Override public Loader<String> onCreateLoader(int id, Bundle args) { return new AsyncTaskLoader<String>(getActivity()) { @Override public String loadInBackground() { return doHeavyTask(); } }; } @Override public void onLoadFinished(Loader<String> loader, String data) { showResult(data); } @Override public void onLoaderReset(Loader<String> loader) {} } Loaders
  • 18. Loaders • boilerplate • good for cursors • deals with activity/fragment lifecycle • difficult composition • difficult to adjust logic
  • 19. Async on Android • many other async libraries – some are better – some are worse
  • 21. RxJava • Java VM implementation of Reactive Extensions • a library for composing flows and sequences of asynchronous data • open-source • https://github.com/ReactiveX/RxJava • by Netflix
  • 22. RxJava • DSL for creating computation flows from async sources • flows called Observables • push semantics of Observables
  • 23. RxJava … not sure if …
  • 24. Future proxy or wrapper around an object that is not yet there future.get() future.isDone() • non-trivial complexity when nested • difficult to compose conditional asynchronous execution flows
  • 26. Iterable vs. Observable // Iterable<String> getData() .skip(10) .take(5) .map({s -> return s + “1”}) .forEach({ println it }); // Observable<String> getData() .skip(10) .take(5) .map({s -> return s + “1”}) .subscribe({ println it });
  • 27. Iterable vs. Observable single items multiple items synchronous T getData() Iterable<T> getData() asynchronous Future<T> getData() Observable<T> getData()
  • 28. Iterable vs. Observable event Iterable (pull) Observable (push) retrieve data T next() onNext(T) discover error throws Exception onError(Exception) complete !hasNext() onCompleted()
  • 29. Observable Calling Thread public Observable<String> getData(); Callback Thread synchronous on calling thread
  • 30. Observable Calling Thread public Observable<String> getData(); Callback Thread Thread Pool asynchronous on a separate thread
  • 31. Observable Calling Thread public Observable<String> getData(); Callback Threads Thread Pool asynchronous on multiple threads
  • 32. Observable • not biased toward some particular source of asynchronicity • the implementation chooses if the code will be blocking or non-blocking
  • 33. public interface Observer <T> { void onCompleted(); void onError(Throwable throwable); void onNext(T t); } Observable
  • 34. public Observable<String> getStrings() { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { try { subscriber.onNext("Hello"); subscriber.onNext("World"); subscriber.onCompleted(); } catch (Exception ex) { subscriber.onError(ex); } } }); } Observable
  • 35. Observable<String> strings = getStrings(); strings.subscribe( new Observer<String>() { @Override public void onCompleted() { Log.d("rx", "no more data"); } @Override public void onError(Throwable throwable) { Log.e(“rx”, “error”, throwable); } @Override public void onNext(String s) { showResult(s); } }); Observer
  • 36. Observable<String> strings = getStrings(); strings.subscribe( new Observer<String>() { @Override public void onCompleted() { Log.d("rx", "no more data"); } @Override public void onError(Throwable throwable) { Log.e(“rx”, “error”, throwable); } @Override public void onNext(String s) { showResult(s); } }); Observer
  • 37. Observable<String> strings = getStrings(); strings.subscribe( new Observer<String>() { @Override public void onCompleted() { Log.d("rx", "no more data"); } @Override public void onError(Throwable throwable) { Log.e(“rx”, “error”, throwable); } @Override public void onNext(String s) { showResult(s); } }); Observer
  • 38. Observable<String> strings = getStrings(); strings.subscribe( new Observer<String>() { @Override public void onCompleted() { Log.d("rx", "no more data"); } @Override public void onError(Throwable throwable) { Log.e(“rx”, “error”, throwable); } @Override public void onNext(String s) { showResult(s); } }); Observer
  • 39. Observable<String> strings = getStrings(); Subscription subsctiption = strings.subscribe( new Observer<String>() { @Override public void onCompleted() { Log.d("rx", "no more data"); } @Override public void onError(Throwable throwable) { Log.e(“rx”, “error”, throwable); } @Override public void onNext(String s) { showResult(s); } }); Observer
  • 40. Subscription Subscription subsctiption; subscription.unsubscribe(); subscription.isUnsubscribed();
  • 42. RxAndroid Android specific things for Rx • Scheduler • reliable and thread-safe with regarding Fragment/Activity life-cycle • reactive components for Android use cases and UI
  • 43. RxAndroid • https://github.com/ReactiveX/RxAndroid • 'io.reactivex:rxandroid:0.23.0' • formerly rxjava-android
  • 44. Image Loading Observable<Bitmap> imageObservable = Observable.create(observer -> { return downloadBitmap(); }); imageObservable .subscribe(image -> loadToImageView(image));
  • 45. Image Loading Observable<Bitmap> imageObservable = Observable.create(observer -> { return downloadBitmap(); }); imageObservable .subscribe(image -> loadToImageView(image));
  • 46. Image Loading imageObservable .subscribeOn(Schedulers.newThread()) .subscribe(image -> loadToImageView(image));
  • 47. Image Loading imageObservable .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(image -> loadToImageView(image));
  • 48. Image Loading imageObservable .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(image -> loadToImageView(image));
  • 49. public void onDestroy() { super.onDestroy(); subscription.unsubscribe(); } Lifecycle & Memory Leaks
  • 50. Fragment/Activity Lifecycle ContentObservable .bindFragment(fragment, observable); ContentObservable .bindActivity(activity, observable);
  • 51. Broadcast Receiver Observable<Intent> observable = ContentObservable .fromBroadcast(context, intentFilter); Observable<Intent> observable = ContentObservable .fromLocalBroadcast(context, intentFilter);
  • 52. Views Observable<OnClickEvent> observable = ViewObservable.clicks(view); ViewObservable .bindView(view, observable);
  • 54. Creating Observables • manually from scratch create()
  • 55. Creating Observables • convert existing data structure into an Observable from() – Iterable, Future, Array repeat() – emit source Observable repeatedly
  • 56. Creating Observables • convert existing data structure into an Observable timer() – emits a single item after a given time
  • 57. Creating Observables • convert existing data structure into an Observable empty() – emits nothing and completes error() – emits nothing and signals an error never() – emits nothing at all
  • 58. Obervables are composable transform - map, flatMap, reduce, scan filter - take, skip, sample, filter combine - concat, merge, zip, cache concurrency - observeOn, subcribeOn error handling - onErrorReturn
  • 60. Transforming Observables map() – apply a function to each item
  • 61. Transforming Observables flatMap() – transform items into Observables and flatten
  • 62. Transforming Observables scan() – apply a function to each item sequentially and emit each successive value
  • 63. Transforming Observables groupBy() – divide into a set of Observables
  • 64. Transforming Observables buffer() – periodically gather items into bundles and emits these bundles
  • 66. Filtering Observable filter() – filter emitted items
  • 67. Filtering Observable take() – emit only first n items
  • 68. Filtering Observable timeout() – emit items, but issue an exception if nothing emitted in a timespan
  • 69. Filtering Observable distinct() – suppress duplicate items
  • 70. Filtering Observable takeLastBuffer() first() elementAt() – emit only n-th element ignoreElements() – pass only error or completed
  • 72. Combining Observables merge() – combine multiple Observables
  • 73. Combining Observables zip() – combine multiple Observables via a function, emit results of the function
  • 75. Error Handling recovering from onError() onErrorResumeNext() – emit a sequence if error happens
  • 76. Error Handling onErrorReturn() – emit an item if error happens
  • 77. Error Handling retry() – resubscribe to a source
  • 78. Support for RxJava in other libraries
  • 79. Retrofit @GET("/user/{id}/photo") Observable<Photo> getUserPhoto(@Path("id") int id);
  • 80. private Object simpleMethod() { ... } public Observable<Object> newMethod() { return Observable.just(simpleMethod()); } Plain old library
  • 81. private Object simpleMethod() { ... } public Observable<Object> newMethod() { return Observable.defer(() -> Observable.just(simpleMethod()) ); } Plain old library
  • 82. Java 8 & Android No lambdas on Android – use different language on Android – or rather not
  • 83. Retrolambda transforms Java 8 compiled bytecode for older JVM • gradle-retrolambda – https://github.com/evant/gradle-retrolambda – 'me.tatarka:gradle-retrolambda:2.4.1' • retrolambda – https://github.com/orfjackal/retrolambda
  • 84. strings.map(new Func1<String, Integer>() { @Override public Integer call(String s) { return s.length(); } }); Without Retrolambda
  • 85. strings.map( (String s) -> { return s.length(); } ); With Retrolambda
  • 86. Problems • RxAndroid APIs not yet stabilized even though RxJava hitting version 1.0 – RxAndroid version 0.23 • backpressure