SlideShare ist ein Scribd-Unternehmen logo
1 von 46
Downloaden Sie, um offline zu lesen
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")

);
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

);
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]]
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));
}
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?

Weitere ähnliche Inhalte

Was ist angesagt?

Automated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.xAutomated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.x
Tatsuya Maki
 

Was ist angesagt? (20)

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

Andere mochten auch

Andere mochten auch (13)

Reactive Streams and RxJava2
Reactive Streams and RxJava2Reactive Streams and RxJava2
Reactive Streams and RxJava2
 
Live chym kysubrse vs toidicodedao
Live chym kysubrse vs toidicodedaoLive chym kysubrse vs toidicodedao
Live chym kysubrse vs toidicodedao
 
Từ Gà Đến Pro Git và GitHub trong 60 phút
Từ Gà Đến Pro Git và GitHub trong 60 phútTừ Gà Đến Pro Git và GitHub trong 60 phút
Từ Gà Đến Pro Git và GitHub trong 60 phút
 
Luận văn tìm hiểu Spring
Luận văn tìm hiểu SpringLuận văn tìm hiểu Spring
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
Sinh viên IT học và làm gì để không thất nghiệpSinh viên IT học và làm gì để không thất nghiệp
Sinh viên IT học và làm gì để không thất nghiệp
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Lap trinh java hieu qua
Lap trinh java hieu quaLap trinh java hieu qua
Lap trinh java hieu qua
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Hành trình trở thành web đì ve lốp pơ
Hành trình trở thành web đì ve lốp pơHành trình trở thành web đì ve lốp pơ
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
Từ Sinh Viên IT tới Lập Trình ViênTừ Sinh Viên IT tới Lập Trình Viên
Từ Sinh Viên IT tới Lập Trình Viên
 
Effective Java
Effective JavaEffective Java
Effective Java
 
Effective java
Effective javaEffective java
Effective java
 
Effective java
Effective javaEffective java
Effective java
 

Ähnlich wie Intro to Retrofit 2 and RxJava2

Ähnlich wie Intro to Retrofit 2 and RxJava2 (20)

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

Mehr von Fabio Collini

Mehr von Fabio Collini (20)

Architectures in the compose world
Architectures in the compose worldArchitectures in the compose world
Architectures in the compose world
 
Managing parallelism using coroutines
Managing parallelism using coroutinesManaging parallelism using coroutines
Managing parallelism using coroutines
 
Kotlin delegates in practice - Kotlin Everywhere Stockholm
Kotlin delegates in practice - Kotlin Everywhere StockholmKotlin delegates in practice - Kotlin Everywhere Stockholm
Kotlin delegates in practice - Kotlin Everywhere Stockholm
 
Using Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectUsing Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture project
 
Solid principles in practice the clean architecture - Droidcon Italy
Solid principles in practice the clean architecture - Droidcon ItalySolid principles in practice the clean architecture - Droidcon Italy
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 - Devfest Emila RomagnaSOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
 
SOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean ArchitectureSOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean Architecture
 
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
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
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
 
Recap Google I/O 2018
Recap Google I/O 2018Recap Google I/O 2018
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 - Droidcon italyFrom java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
 
From java to kotlin beyond alt+shift+cmd+k
From java to kotlin beyond alt+shift+cmd+kFrom java to kotlin beyond alt+shift+cmd+k
From java to kotlin beyond alt+shift+cmd+k
 
Android Data Binding in action using MVVM pattern - droidconUK
Android Data Binding in action using MVVM pattern - droidconUKAndroid Data Binding in action using MVVM pattern - droidconUK
Android Data Binding in action using MVVM pattern - droidconUK
 
Data Binding in Action using MVVM pattern
Data Binding in Action using MVVM patternData Binding in Action using MVVM pattern
Data Binding in Action using MVVM pattern
 
Android Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG FirenzeAndroid Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG Firenze
 
Testable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVMTestable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVM
 
Testable Android Apps DroidCon Italy 2015
Testable Android Apps DroidCon Italy 2015Testable Android Apps DroidCon Italy 2015
Testable Android Apps DroidCon Italy 2015
 
Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
 
Librerie su Android: come non reinventare la ruota @ whymca 2012
Librerie su Android: come non reinventare la ruota @ whymca 2012 Librerie su Android: come non reinventare la ruota @ whymca 2012
Librerie su Android: come non reinventare la ruota @ whymca 2012
 
Android Widget @ whymca 2011
Android Widget @ whymca 2011Android Widget @ whymca 2011
Android Widget @ whymca 2011
 

Kürzlich hochgeladen

scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
HenryBriggs2
 
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments""Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
mphochane1998
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
Epec Engineered Technologies
 
+97470301568>> buy weed in qatar,buy thc oil qatar,buy weed and vape oil in d...
+97470301568>> buy weed in qatar,buy thc oil qatar,buy weed and vape oil in d...+97470301568>> buy weed in qatar,buy thc oil qatar,buy weed and vape oil in d...
+97470301568>> buy weed in qatar,buy thc oil qatar,buy weed and vape oil in d...
Health
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
Neometrix_Engineering_Pvt_Ltd
 

Kürzlich hochgeladen (20)

scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
scipt v1.pptxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
 
Rums floating Omkareshwar FSPV IM_16112021.pdf
Rums floating Omkareshwar FSPV IM_16112021.pdfRums floating Omkareshwar FSPV IM_16112021.pdf
Rums floating Omkareshwar FSPV IM_16112021.pdf
 
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments""Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
 
Online electricity billing project report..pdf
Online electricity billing project report..pdfOnline electricity billing project report..pdf
Online electricity billing project report..pdf
 
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
 
Thermal Engineering -unit - III & IV.ppt
Thermal Engineering -unit - III & IV.pptThermal Engineering -unit - III & IV.ppt
Thermal Engineering -unit - III & IV.ppt
 
Work-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptxWork-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptx
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
 
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
data_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdfdata_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdf
 
A CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptx
A CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptxA CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptx
A CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptx
 
Minimum and Maximum Modes of microprocessor 8086
Minimum and Maximum Modes of microprocessor 8086Minimum and Maximum Modes of microprocessor 8086
Minimum and Maximum Modes of microprocessor 8086
 
+97470301568>> buy weed in qatar,buy thc oil qatar,buy weed and vape oil in d...
+97470301568>> buy weed in qatar,buy thc oil qatar,buy weed and vape oil in d...+97470301568>> buy weed in qatar,buy thc oil qatar,buy weed and vape oil in d...
+97470301568>> buy weed in qatar,buy thc oil qatar,buy weed and vape oil in d...
 
Computer Networks Basics of Network Devices
Computer Networks  Basics of Network DevicesComputer Networks  Basics of Network Devices
Computer Networks Basics of Network Devices
 
HAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKAR
HAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKARHAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKAR
HAND TOOLS USED AT ELECTRONICS WORK PRESENTED BY KOUSTAV SARKAR
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . ppt
 
Unleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leapUnleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leap
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
 
Engineering Drawing focus on projection of planes
Engineering Drawing focus on projection of planesEngineering Drawing focus on projection of planes
Engineering Drawing focus on projection of planes
 

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")
 );
  • 21.
  • 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
 );
  • 24.
  • 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]]
  • 28.
  • 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)); }
  • 40.
  • 41.
  • 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