SlideShare a Scribd company logo
Introduction to Retrofit 2
and RxJava 2
Fabio Collini
Google I/O extended
Florence
May 2017
2
Ego slide
@fabioCollini
linkedin.com/in/fabiocollini
github.com/fabioCollini
medium.com/@fabioCollini
codingjam.it
Android programmazione avanzata
3
Retrofit
Turns your REST API into a Java interface
Simple to use
JSON conversion using Gson
Custom converters
 …
4
RxJava
A Java VM implementation of ReactiveX (Reactive
Extensions): a library for composing asynchronous
and event-based programs by using observable
sequences.
5
RxJava is not simple…
6
github.com/fabioCollini/
IntroToRetrofit2RxJava2
Demo project
7
HTTP request definition
public interface StackOverflowService {



@GET("/users")
Call<List<User>> getTopUsers();
@GET("/users/{userId}/top-tags")
Call<List<Tag>> getTags(@Path("userId") int userId);



@GET("/users/{userId}/badges")
Call<List<Badge>> getBadges(@Path("userId") int userId);

}
8
Other annotations
@GET, @POST, @PUT, @DELETE, @HEAD
@Path
@Query
@QueryMap
@Body
@FormUrlEncoded
@Field
@Headers
OkHttpClient okHttpClient = new OkHttpClient.Builder()

.addInterceptor(chain -> {

Request request = chain.request();

HttpUrl url = request.url().newBuilder()

.addQueryParameter("site", "stackoverflow")

.addQueryParameter("key", “...”)

.build();

request = request.newBuilder().url(url).build();

return chain.proceed(request);

})

.build();



Gson gson = new GsonBuilder()

.registerTypeAdapterFactory(MyAdapterFactory.create())

.create();

StackOverflowService service = new Retrofit.Builder()

.baseUrl("http://api.stackexchange.com/2.2/")

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.client(okHttpClient)

.addConverterFactory(new DenvelopingConverter(gson))

.addConverterFactory(GsonConverterFactory.create(gson))

.build()
.create(StackOverflowService.class);
9
Service creation
10
Synchronous request
try {

Response<List<User>> response =
service.getTopUsers().execute();

if (response.isSuccessful()) {

List<User> users = response.body();

//...

} else {

//server error

}

} catch (IOException e) {

//connection error

}
11
Asynchronous request
service.getTopUsers().enqueue(new Callback<List<User>>() {

@Override

public void onResponse(Call<List<User>> call, Response<List<User>> r) {

if (r.isSuccessful()) {

List<User> users = response.body();

//...

} else {

//server error

}

}



@Override public void onFailure(Call<List<User>> call, Throwable t) {

//connection error

}

});
12
Callback hell
enqueue(service.getTopUsers(), new MyCallback<List<User>>() {

@Override

public void onResponse(List<User> users) {

User user = users.get(0);

enqueue(service.getTags(user.id()), new MyCallback<List<Tag>>() {

@Override

public void onResponse(List<Tag> tags) {

enqueue(service.getBadges(user.id()), new MyCallback<List<Badge>>() {

@Override

public void onResponse(List<Badge> badges) {

callback.onResponse(UserStats.create(user, tags, badges));

}



@Override public void onFailure(Throwable throwable) {

callback.onFailure(throwable);

}

});

}



@Override public void onFailure(Throwable throwable) {

callback.onFailure(throwable);

}

});

}



@Override public void onFailure(Throwable throwable) {

callback.onFailure(throwable);

}

});
+ RxJavaRetrofit
13
public interface StackOverflowService {



@GET("/users")
Call<List<User>> getTopUsers();

}_
14
Retrofit + RxJava
public interface StackOverflowService {



@GET("/users")
Single<List<User>> getTopUsers();

}_
15
RxJava in action
service.getTopUsers()

.subscribe(

users -> {

if (users.size() > 5)

users = users.subList(0, 5);

System.out.println(users);

},
Throwable::printStackTrace

);
16
Threading
service.getTopUsers()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread)

.subscribe(

users -> {

if (users.size() > 5)

users = users.subList(0, 5);

System.out.println(users);

},
Throwable::printStackTrace

);
17
Single
(onSuccess | onError)?
18
Observable
onNext* (onComplete | onError)?
19
Observable creation
Observable.just(1, 2, 3);
Observable.interval(5, TimeUnit.SECONDS);

Observable.fromCallable(() -> {

//...

return createFirstValue();

});

Observable.create(emitter -> {

try {

emitter.onNext(createFirstValue());

emitter.onNext(createSecondValue());

emitter.onComplete();

} catch (Throwable t) {

emitter.onError(t);

}

});
20
Observable in action
public Disposable subscribe(
Consumer<? super T> onNext,
Consumer<? super Throwable> onError,
Action onComplete);
Observable.just(1, 2, 3).subscribe(

System.out::println,

Throwable::printStackTrace,

() -> System.out.println("Completed")

);
Intro to Retrofit 2 and RxJava2
22
service.getTopUsers()

.subscribe(

users -> {

if (users.size() > 5)

users = users.subList(0, 5);

System.out.println(users);

},
Throwable::printStackTrace

);
23
service.getTopUsers()

.map(users -> users.size() > 5 ?

users.subList(0, 5) : users)

.subscribe(

System.out::println,

Throwable::printStackTrace

);
Intro to Retrofit 2 and RxJava2
25
zip
private Single<UserStats> loadUserStats(User user) {

return Single.zip(

service.getBadges(user.id()),__

service.getTags(user.id()),___

(badges, tags) -> UserStats.create(user, tags, badges)

);

}_
26
zip
private Single<UserStats> loadUserStats(User user) {

return Single.zip(

service.getBadges(user.id()).subscribeOn(Schedulers.io()),__

service.getTags(user.id()).subscribeOn(Schedulers.io()),___

(badges, tags) -> UserStats.create(user, tags, badges)

);

}_
27
Multi value map
Observable<Observable<Integer>> observable =

Observable.just(1, 2, 3).map(

i -> Observable.just(i * 10, i * 10 + 1)

);
[1, 2, 3]
[[10, 11], [20, 21], [30, 31]]
Intro to Retrofit 2 and RxJava2
29
map
Observable<Integer> observable =

Observable.just(1, 2, 3).flatMap(

i -> Observable.just(i * 10, i * 10 + 1)

);

[1, 2, 3]
[10, 11, 20, 21, 30, 31]
[1, 2, 3]
[[10, 11], [20, 21], [30, 31]]
Observable<Observable<Integer>> observable =

Observable.just(1, 2, 3).map(

i -> Observable.just(i * 10, i * 10 + 1)

);
flatMap
30
flatMap
Single<Profile> single =

service.login(userName, password)

.flatMap(service::getProfile);
31
service.getTopUsers() //1 List<20 User>
.map(users -> users.size() > 5 ?
users.subList(0, 5) : users) //1 List<5 User>
32
service.getTopUsers() //1 List<20 User>

.map(users -> users.size() > 5 ?
users.subList(0, 5) : users) //1 List<5 User>
.flatMapObservable(users ->
Observable.fromIterable(users)) //5 User
33
service.getTopUsers() //1 List<20 User>

.map(users -> users.size() > 5 ?
users.subList(0, 5) : users) //1 List<5 User>
.flattenAsObservable(users -> users) // 5 User
34
service.getTopUsers() //1 List<20 User>

.flattenAsObservable(users -> users) // 20 User
.take(5) // 5 User
35
service.getTopUsers() //1 List<20 User>

.flattenAsObservable(users -> users) // 20 User

.take(5) // 5 User

.flatMapSingle(user ->

loadUserStats(service, user)) // 5 UserStats
36
Single<List<UserStats>> single =
service.getTopUsers() //1 List<20 User>

.flattenAsObservable(users -> users) // 20 User

.take(5) // 5 User

.flatMapSingle(user ->

loadUserStats(service, user)) // 5 UserStats

.toList(); // 1 List<5 UserStats>
37
Single<List<UserStats>> single =
service.getTopUsers() //1 List<20 User>

.flattenAsObservable(users -> users) // 20 User

.take(5) // 5 User

.flatMapSingle(user ->

loadUserStats(service, user)) // 5 UserStats

.toList(); // 1 List<5 UserStats>
single.subscribe(

UserStats::printList,

Throwable::printStackTrace

);
38
730.876 Darin Dimitrov (Sofia, Bulgaria)
c# (7.260), asp.net-mvc (6.780), asp.net-mvc-3 (4.629), jquery (3.043), asp.net (3.455)
Teacher, Student, Editor, Cleanup, Organizer
724.614 BalusC (Amsterdam, Netherlands)
java (6.468), jsf (6.957), jsf-2 (3.809), servlets (2.234), jsp (2.860)
php, regex, servlets, java, security
677.074 VonC (France)
git (8.555), eclipse (1.715), github (2.417), java (951), version-control (1.075)
c, python, php, regex, c#
692.535 Hans Passant (Madison, WI)
c# (8.199), .net (4.254), winforms (2.485), c++ (2.084), vb.net (1.457)
Tag Editor, Announcer, reference, c, excel
944.295 Jon Skeet (Reading, United Kingdom)
c# (18.363), java (10.213), .net (5.338), linq (2.879), string (954)
cryptography, reference, c, python, php
Single<List<UserStats>> single =
service.getTopUsers() //1 List<20 User>

.flattenAsObservable(users -> users) // 20 User

.take(5) // 5 User

.flatMapSingle(user ->

loadUserStats(service, user)) // 5 UserStats

.toList(); // 1 List<5 UserStats>
single.subscribe(

UserStats::printList,

Throwable::printStackTrace

);
39
flatMap source code (RxJava1)
public final <R> Observable<R> flatMap(
Func1<
? super T,
? extends Observable<? extends R>
> func) {
return merge(map(func));
}
Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2
42
Single<List<UserStats>> single =
service.getTopUsers() //1 List<20 User>

.flattenAsObservable(users -> users) // 20 User

.take(5) // 5 User

.concatMapEager(user ->

loadUserStats(service, user).toObservable()) // 5 User

.toList(); // 1 List<5 UserStats>
single.subscribe(

UserStats::printList,

Throwable::printStackTrace

);
43
944.295 Jon Skeet (Reading, United Kingdom)
c# (18.363), java (10.213), .net (5.338), linq (2.879), string (954)
cryptography, reference, c, python, php
730.876 Darin Dimitrov (Sofia, Bulgaria)
c# (7.260), asp.net-mvc (6.780), asp.net-mvc-3 (4.629), jquery (3.043), asp.net (3.455)
Teacher, Student, Editor, Cleanup, Organizer
724.614 BalusC (Amsterdam, Netherlands)
java (6.468), jsf (6.957), jsf-2 (3.809), servlets (2.234), jsp (2.860)
php, regex, servlets, java, security
692.535 Hans Passant (Madison, WI)
c# (8.199), .net (4.254), winforms (2.485), c++ (2.084), vb.net (1.457)
Tag Editor, Announcer, reference, c, excel
677.074 VonC (France)
git (8.555), eclipse (1.715), github (2.417), java (951), version-control (1.075)
c, python, php, regex, c#
Single<List<UserStats>> single =
service.getTopUsers() //1 List<20 User>

.flattenAsObservable(users -> users) // 20 User

.take(5) // 5 User

.concatMapEager(user ->

loadUserStats(service, user).toObservable()) // 5 User

.toList(); // 1 List<5 UserStats>
single.subscribe(

UserStats::printList,

Throwable::printStackTrace

);
44
service.getTopUsers()

.flattenAsObservable(users -> users)

.take(5)

.concatMapEager(user -> Single.zip(

service.getBadges(user.id()).subscribeOn(Schedulers.io()),

service.getTags(user.id()).subscribeOn(Schedulers.io()),

(badges, tags) -> UserStats.create(user, tags, badges)

).toObservable())

.toList()
.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(

UserStats::printList,

Throwable::printStackTrace

);
Wrapping up
45
This is just the beginning…
Observable class contains more than 400 methods:
distinct, debounce, retry, repeat, timeout, …
disposable
error management
Single, Observable, Flowable, Completable, Maybe
hot and cold observable
subjects
TestScheduler
github.com/fabioCollini/IntroToRetrofit2RxJava2
@fabioCollini
linkedin.com/in/fabiocollini
github.com/fabioCollini
medium.com/@fabioCollini
Thanks for your attention!
Questions?

More Related Content

PDF
Testing Android apps based on Dagger and RxJava
PDF
Testing Android apps based on Dagger and RxJava Droidcon UK
PDF
Introduction to Retrofit and RxJava
PDF
Android architecture component - FbCircleDev Yogyakarta Indonesia
PDF
Advanced Dagger talk from 360andev
PPTX
Rx java in action
PDF
Android programming -_pushing_the_limits
PDF
GKAC 2015 Apr. - RxAndroid
Testing Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJava Droidcon UK
Introduction to Retrofit and RxJava
Android architecture component - FbCircleDev Yogyakarta Indonesia
Advanced Dagger talk from 360andev
Rx java in action
Android programming -_pushing_the_limits
GKAC 2015 Apr. - RxAndroid

What's hot (20)

PDF
Retrofit
PDF
Using hilt in a modularized project
PDF
Automated%20testing%20with%20Espresso2.x
PPTX
Open sourcing the store
PDF
Kotlin Delegates in practice - Kotlin community conf
PPTX
Reactive programming with RxAndroid
PPTX
Getting started with Java 9 modules
PDF
Epoxy 介紹
PDF
Practical RxJava for Android
PPTX
Reactive Java (33rd Degree)
PDF
Workshop 26: React Native - The Native Side
PDF
Jetpack, with new features in 2021 GDG Georgetown IO Extended
PDF
Practical Protocol-Oriented-Programming
PDF
Testing Java Code Effectively
PDF
React, Redux and es6/7
PDF
What's Coming in Spring 3.0
PDF
Building an app with Google's new suites
ODP
To inject or not to inject: CDI is the question
PDF
What’s new in Android JetPack
PDF
Modern Android app library stack
Retrofit
Using hilt in a modularized project
Automated%20testing%20with%20Espresso2.x
Open sourcing the store
Kotlin Delegates in practice - Kotlin community conf
Reactive programming with RxAndroid
Getting started with Java 9 modules
Epoxy 介紹
Practical RxJava for Android
Reactive Java (33rd Degree)
Workshop 26: React Native - The Native Side
Jetpack, with new features in 2021 GDG Georgetown IO Extended
Practical Protocol-Oriented-Programming
Testing Java Code Effectively
React, Redux and es6/7
What's Coming in Spring 3.0
Building an app with Google's new suites
To inject or not to inject: CDI is the question
What’s new in Android JetPack
Modern Android app library stack
Ad

Viewers also liked (13)

PDF
Reactive Streams and RxJava2
PDF
Live chym kysubrse vs toidicodedao
PDF
Từ Gà Đến Pro Git và GitHub trong 60 phút
PDF
Luận văn tìm hiểu Spring
PPTX
Sinh viên IT học và làm gì để không thất nghiệp
PDF
Spring mvc
PPT
Lap trinh java hieu qua
PPTX
Spring mvc
PPTX
Hành trình trở thành web đì ve lốp pơ
PDF
Từ Sinh Viên IT tới Lập Trình Viên
PPTX
Effective Java
PDF
Effective java
PPTX
Effective java
Reactive Streams and RxJava2
Live chym kysubrse vs toidicodedao
Từ Gà Đến Pro Git và GitHub trong 60 phút
Luận văn tìm hiểu Spring
Sinh viên IT học và làm gì để không thất nghiệp
Spring mvc
Lap trinh java hieu qua
Spring mvc
Hành trình trở thành web đì ve lốp pơ
Từ Sinh Viên IT tới Lập Trình Viên
Effective Java
Effective java
Effective java
Ad

Similar to Intro to Retrofit 2 and RxJava2 (20)

PDF
Programming IoT Gateways in JavaScript with macchina.io
PPTX
Cloud nativeworkshop
PPTX
Annotation processing
PPTX
PDF
RxJava applied [JavaDay Kyiv 2016]
PDF
Xitrum @ Scala Matsuri Tokyo 2014
PDF
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
PDF
Reactive Functional Programming with Java 8 on Android N
PDF
Java Libraries You Can’t Afford to Miss
PPT
Come on, PHP 5.4!
PDF
Scripting GeoServer
PDF
Advanced Google Analytics for iOS - How to not kill your SEO
PDF
Easy REST APIs with Jersey and RestyGWT
PDF
Fun Teaching MongoDB New Tricks
ODP
Web program-peformance-optimization
PDF
Microservices in GO - Massimiliano Dessì - Codemotion Rome 2017
PDF
OpenStack API's and WSGI
PDF
Building Modern Apps using Android Architecture Components
PDF
Boost Development With Java EE7 On EAP7 (Demitris Andreadis)
PPTX
Cloud nativemicroservices jax-london2020
Programming IoT Gateways in JavaScript with macchina.io
Cloud nativeworkshop
Annotation processing
RxJava applied [JavaDay Kyiv 2016]
Xitrum @ Scala Matsuri Tokyo 2014
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Reactive Functional Programming with Java 8 on Android N
Java Libraries You Can’t Afford to Miss
Come on, PHP 5.4!
Scripting GeoServer
Advanced Google Analytics for iOS - How to not kill your SEO
Easy REST APIs with Jersey and RestyGWT
Fun Teaching MongoDB New Tricks
Web program-peformance-optimization
Microservices in GO - Massimiliano Dessì - Codemotion Rome 2017
OpenStack API's and WSGI
Building Modern Apps using Android Architecture Components
Boost Development With Java EE7 On EAP7 (Demitris Andreadis)
Cloud nativemicroservices jax-london2020

More from Fabio Collini (20)

PDF
Architectures in the compose world
PDF
Managing parallelism using coroutines
PDF
Kotlin delegates in practice - Kotlin Everywhere Stockholm
PDF
Using Dagger in a Clean Architecture project
PDF
Solid principles in practice the clean architecture - Droidcon Italy
PDF
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
PDF
SOLID principles in practice: the Clean Architecture
PDF
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
PDF
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
PDF
Recap Google I/O 2018
PDF
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
PDF
From java to kotlin beyond alt+shift+cmd+k
PDF
Android Data Binding in action using MVVM pattern - droidconUK
PDF
Data Binding in Action using MVVM pattern
PDF
Android Wear CodeLab - GDG Firenze
PDF
Testable Android Apps using data binding and MVVM
PDF
Testable Android Apps DroidCon Italy 2015
PDF
Clean android code - Droidcon Italiy 2014
KEY
Librerie su Android: come non reinventare la ruota @ whymca 2012
KEY
Android Widget @ whymca 2011
Architectures in the compose world
Managing parallelism using coroutines
Kotlin delegates in practice - Kotlin Everywhere Stockholm
Using Dagger in a Clean Architecture project
Solid principles in practice the clean architecture - Droidcon Italy
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
SOLID principles in practice: the Clean Architecture
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Recap Google I/O 2018
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k
Android Data Binding in action using MVVM pattern - droidconUK
Data Binding in Action using MVVM pattern
Android Wear CodeLab - GDG Firenze
Testable Android Apps using data binding and MVVM
Testable Android Apps DroidCon Italy 2015
Clean android code - Droidcon Italiy 2014
Librerie su Android: come non reinventare la ruota @ whymca 2012
Android Widget @ whymca 2011

Recently uploaded (20)

PPTX
Sustainable Sites - Green Building Construction
PPTX
MET 305 2019 SCHEME MODULE 2 COMPLETE.pptx
PPT
Mechanical Engineering MATERIALS Selection
PPTX
Artificial Intelligence
PPT
Introduction, IoT Design Methodology, Case Study on IoT System for Weather Mo...
PDF
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
PPTX
Geodesy 1.pptx...............................................
PPTX
bas. eng. economics group 4 presentation 1.pptx
PDF
composite construction of structures.pdf
PDF
Model Code of Practice - Construction Work - 21102022 .pdf
PPTX
CYBER-CRIMES AND SECURITY A guide to understanding
PDF
Digital Logic Computer Design lecture notes
PPTX
additive manufacturing of ss316l using mig welding
PDF
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
PDF
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
PDF
Unit I ESSENTIAL OF DIGITAL MARKETING.pdf
PPTX
Current and future trends in Computer Vision.pptx
PPTX
Safety Seminar civil to be ensured for safe working.
PDF
TFEC-4-2020-Design-Guide-for-Timber-Roof-Trusses.pdf
PPTX
M Tech Sem 1 Civil Engineering Environmental Sciences.pptx
Sustainable Sites - Green Building Construction
MET 305 2019 SCHEME MODULE 2 COMPLETE.pptx
Mechanical Engineering MATERIALS Selection
Artificial Intelligence
Introduction, IoT Design Methodology, Case Study on IoT System for Weather Mo...
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
Geodesy 1.pptx...............................................
bas. eng. economics group 4 presentation 1.pptx
composite construction of structures.pdf
Model Code of Practice - Construction Work - 21102022 .pdf
CYBER-CRIMES AND SECURITY A guide to understanding
Digital Logic Computer Design lecture notes
additive manufacturing of ss316l using mig welding
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Unit I ESSENTIAL OF DIGITAL MARKETING.pdf
Current and future trends in Computer Vision.pptx
Safety Seminar civil to be ensured for safe working.
TFEC-4-2020-Design-Guide-for-Timber-Roof-Trusses.pdf
M Tech Sem 1 Civil Engineering Environmental Sciences.pptx

Intro to Retrofit 2 and RxJava2

  • 1. Introduction to Retrofit 2 and RxJava 2 Fabio Collini Google I/O extended Florence May 2017
  • 3. 3 Retrofit Turns your REST API into a Java interface Simple to use JSON conversion using Gson Custom converters  …
  • 4. 4 RxJava A Java VM implementation of ReactiveX (Reactive Extensions): a library for composing asynchronous and event-based programs by using observable sequences.
  • 5. 5 RxJava is not simple…
  • 7. 7 HTTP request definition public interface StackOverflowService {
 
 @GET("/users") Call<List<User>> getTopUsers(); @GET("/users/{userId}/top-tags") Call<List<Tag>> getTags(@Path("userId") int userId);
 
 @GET("/users/{userId}/badges") Call<List<Badge>> getBadges(@Path("userId") int userId);
 }
  • 8. 8 Other annotations @GET, @POST, @PUT, @DELETE, @HEAD @Path @Query @QueryMap @Body @FormUrlEncoded @Field @Headers
  • 9. OkHttpClient okHttpClient = new OkHttpClient.Builder()
 .addInterceptor(chain -> {
 Request request = chain.request();
 HttpUrl url = request.url().newBuilder()
 .addQueryParameter("site", "stackoverflow")
 .addQueryParameter("key", “...”)
 .build();
 request = request.newBuilder().url(url).build();
 return chain.proceed(request);
 })
 .build();
 
 Gson gson = new GsonBuilder()
 .registerTypeAdapterFactory(MyAdapterFactory.create())
 .create();
 StackOverflowService service = new Retrofit.Builder()
 .baseUrl("http://api.stackexchange.com/2.2/")
 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
 .client(okHttpClient)
 .addConverterFactory(new DenvelopingConverter(gson))
 .addConverterFactory(GsonConverterFactory.create(gson))
 .build() .create(StackOverflowService.class); 9 Service creation
  • 10. 10 Synchronous request try {
 Response<List<User>> response = service.getTopUsers().execute();
 if (response.isSuccessful()) {
 List<User> users = response.body();
 //...
 } else {
 //server error
 }
 } catch (IOException e) {
 //connection error
 }
  • 11. 11 Asynchronous request service.getTopUsers().enqueue(new Callback<List<User>>() {
 @Override
 public void onResponse(Call<List<User>> call, Response<List<User>> r) {
 if (r.isSuccessful()) {
 List<User> users = response.body();
 //...
 } else {
 //server error
 }
 }
 
 @Override public void onFailure(Call<List<User>> call, Throwable t) {
 //connection error
 }
 });
  • 12. 12 Callback hell enqueue(service.getTopUsers(), new MyCallback<List<User>>() {
 @Override
 public void onResponse(List<User> users) {
 User user = users.get(0);
 enqueue(service.getTags(user.id()), new MyCallback<List<Tag>>() {
 @Override
 public void onResponse(List<Tag> tags) {
 enqueue(service.getBadges(user.id()), new MyCallback<List<Badge>>() {
 @Override
 public void onResponse(List<Badge> badges) {
 callback.onResponse(UserStats.create(user, tags, badges));
 }
 
 @Override public void onFailure(Throwable throwable) {
 callback.onFailure(throwable);
 }
 });
 }
 
 @Override public void onFailure(Throwable throwable) {
 callback.onFailure(throwable);
 }
 });
 }
 
 @Override public void onFailure(Throwable throwable) {
 callback.onFailure(throwable);
 }
 });
  • 13. + RxJavaRetrofit 13 public interface StackOverflowService {
 
 @GET("/users") Call<List<User>> getTopUsers();
 }_
  • 14. 14 Retrofit + RxJava public interface StackOverflowService {
 
 @GET("/users") Single<List<User>> getTopUsers();
 }_
  • 15. 15 RxJava in action service.getTopUsers()
 .subscribe(
 users -> {
 if (users.size() > 5)
 users = users.subList(0, 5);
 System.out.println(users);
 }, Throwable::printStackTrace
 );
  • 16. 16 Threading service.getTopUsers()
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread)
 .subscribe(
 users -> {
 if (users.size() > 5)
 users = users.subList(0, 5);
 System.out.println(users);
 }, Throwable::printStackTrace
 );
  • 19. 19 Observable creation Observable.just(1, 2, 3); Observable.interval(5, TimeUnit.SECONDS);
 Observable.fromCallable(() -> {
 //...
 return createFirstValue();
 });
 Observable.create(emitter -> {
 try {
 emitter.onNext(createFirstValue());
 emitter.onNext(createSecondValue());
 emitter.onComplete();
 } catch (Throwable t) {
 emitter.onError(t);
 }
 });
  • 20. 20 Observable in action public Disposable subscribe( Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete); Observable.just(1, 2, 3).subscribe(
 System.out::println,
 Throwable::printStackTrace,
 () -> System.out.println("Completed")
 );
  • 22. 22 service.getTopUsers()
 .subscribe(
 users -> {
 if (users.size() > 5)
 users = users.subList(0, 5);
 System.out.println(users);
 }, Throwable::printStackTrace
 );
  • 23. 23 service.getTopUsers()
 .map(users -> users.size() > 5 ?
 users.subList(0, 5) : users)
 .subscribe(
 System.out::println,
 Throwable::printStackTrace
 );
  • 25. 25 zip private Single<UserStats> loadUserStats(User user) {
 return Single.zip(
 service.getBadges(user.id()),__
 service.getTags(user.id()),___
 (badges, tags) -> UserStats.create(user, tags, badges)
 );
 }_
  • 26. 26 zip private Single<UserStats> loadUserStats(User user) {
 return Single.zip(
 service.getBadges(user.id()).subscribeOn(Schedulers.io()),__
 service.getTags(user.id()).subscribeOn(Schedulers.io()),___
 (badges, tags) -> UserStats.create(user, tags, badges)
 );
 }_
  • 27. 27 Multi value map Observable<Observable<Integer>> observable =
 Observable.just(1, 2, 3).map(
 i -> Observable.just(i * 10, i * 10 + 1)
 ); [1, 2, 3] [[10, 11], [20, 21], [30, 31]]
  • 29. 29 map Observable<Integer> observable =
 Observable.just(1, 2, 3).flatMap(
 i -> Observable.just(i * 10, i * 10 + 1)
 );
 [1, 2, 3] [10, 11, 20, 21, 30, 31] [1, 2, 3] [[10, 11], [20, 21], [30, 31]] Observable<Observable<Integer>> observable =
 Observable.just(1, 2, 3).map(
 i -> Observable.just(i * 10, i * 10 + 1)
 ); flatMap
  • 30. 30 flatMap Single<Profile> single =
 service.login(userName, password)
 .flatMap(service::getProfile);
  • 31. 31 service.getTopUsers() //1 List<20 User> .map(users -> users.size() > 5 ? users.subList(0, 5) : users) //1 List<5 User>
  • 32. 32 service.getTopUsers() //1 List<20 User>
 .map(users -> users.size() > 5 ? users.subList(0, 5) : users) //1 List<5 User> .flatMapObservable(users -> Observable.fromIterable(users)) //5 User
  • 33. 33 service.getTopUsers() //1 List<20 User>
 .map(users -> users.size() > 5 ? users.subList(0, 5) : users) //1 List<5 User> .flattenAsObservable(users -> users) // 5 User
  • 34. 34 service.getTopUsers() //1 List<20 User>
 .flattenAsObservable(users -> users) // 20 User .take(5) // 5 User
  • 35. 35 service.getTopUsers() //1 List<20 User>
 .flattenAsObservable(users -> users) // 20 User
 .take(5) // 5 User
 .flatMapSingle(user ->
 loadUserStats(service, user)) // 5 UserStats
  • 36. 36 Single<List<UserStats>> single = service.getTopUsers() //1 List<20 User>
 .flattenAsObservable(users -> users) // 20 User
 .take(5) // 5 User
 .flatMapSingle(user ->
 loadUserStats(service, user)) // 5 UserStats
 .toList(); // 1 List<5 UserStats>
  • 37. 37 Single<List<UserStats>> single = service.getTopUsers() //1 List<20 User>
 .flattenAsObservable(users -> users) // 20 User
 .take(5) // 5 User
 .flatMapSingle(user ->
 loadUserStats(service, user)) // 5 UserStats
 .toList(); // 1 List<5 UserStats> single.subscribe(
 UserStats::printList,
 Throwable::printStackTrace
 );
  • 38. 38 730.876 Darin Dimitrov (Sofia, Bulgaria) c# (7.260), asp.net-mvc (6.780), asp.net-mvc-3 (4.629), jquery (3.043), asp.net (3.455) Teacher, Student, Editor, Cleanup, Organizer 724.614 BalusC (Amsterdam, Netherlands) java (6.468), jsf (6.957), jsf-2 (3.809), servlets (2.234), jsp (2.860) php, regex, servlets, java, security 677.074 VonC (France) git (8.555), eclipse (1.715), github (2.417), java (951), version-control (1.075) c, python, php, regex, c# 692.535 Hans Passant (Madison, WI) c# (8.199), .net (4.254), winforms (2.485), c++ (2.084), vb.net (1.457) Tag Editor, Announcer, reference, c, excel 944.295 Jon Skeet (Reading, United Kingdom) c# (18.363), java (10.213), .net (5.338), linq (2.879), string (954) cryptography, reference, c, python, php Single<List<UserStats>> single = service.getTopUsers() //1 List<20 User>
 .flattenAsObservable(users -> users) // 20 User
 .take(5) // 5 User
 .flatMapSingle(user ->
 loadUserStats(service, user)) // 5 UserStats
 .toList(); // 1 List<5 UserStats> single.subscribe(
 UserStats::printList,
 Throwable::printStackTrace
 );
  • 39. 39 flatMap source code (RxJava1) public final <R> Observable<R> flatMap( Func1< ? super T, ? extends Observable<? extends R> > func) { return merge(map(func)); }
  • 42. 42 Single<List<UserStats>> single = service.getTopUsers() //1 List<20 User>
 .flattenAsObservable(users -> users) // 20 User
 .take(5) // 5 User
 .concatMapEager(user ->
 loadUserStats(service, user).toObservable()) // 5 User
 .toList(); // 1 List<5 UserStats> single.subscribe(
 UserStats::printList,
 Throwable::printStackTrace
 );
  • 43. 43 944.295 Jon Skeet (Reading, United Kingdom) c# (18.363), java (10.213), .net (5.338), linq (2.879), string (954) cryptography, reference, c, python, php 730.876 Darin Dimitrov (Sofia, Bulgaria) c# (7.260), asp.net-mvc (6.780), asp.net-mvc-3 (4.629), jquery (3.043), asp.net (3.455) Teacher, Student, Editor, Cleanup, Organizer 724.614 BalusC (Amsterdam, Netherlands) java (6.468), jsf (6.957), jsf-2 (3.809), servlets (2.234), jsp (2.860) php, regex, servlets, java, security 692.535 Hans Passant (Madison, WI) c# (8.199), .net (4.254), winforms (2.485), c++ (2.084), vb.net (1.457) Tag Editor, Announcer, reference, c, excel 677.074 VonC (France) git (8.555), eclipse (1.715), github (2.417), java (951), version-control (1.075) c, python, php, regex, c# Single<List<UserStats>> single = service.getTopUsers() //1 List<20 User>
 .flattenAsObservable(users -> users) // 20 User
 .take(5) // 5 User
 .concatMapEager(user ->
 loadUserStats(service, user).toObservable()) // 5 User
 .toList(); // 1 List<5 UserStats> single.subscribe(
 UserStats::printList,
 Throwable::printStackTrace
 );
  • 44. 44 service.getTopUsers()
 .flattenAsObservable(users -> users)
 .take(5)
 .concatMapEager(user -> Single.zip(
 service.getBadges(user.id()).subscribeOn(Schedulers.io()),
 service.getTags(user.id()).subscribeOn(Schedulers.io()),
 (badges, tags) -> UserStats.create(user, tags, badges)
 ).toObservable())
 .toList() .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(
 UserStats::printList,
 Throwable::printStackTrace
 ); Wrapping up
  • 45. 45 This is just the beginning… Observable class contains more than 400 methods: distinct, debounce, retry, repeat, timeout, … disposable error management Single, Observable, Flowable, Completable, Maybe hot and cold observable subjects TestScheduler