SlideShare ist ein Scribd-Unternehmen logo
1 von 86
Downloaden Sie, um offline zu lesen
Introduction to Retrofit and
RxJava
AppDays 2015 Pordenone
Ego slide
@fabioCollini
linkedin.com/in/fabiocollini
Folder Organizer
GDG Firenze
cosenonjaviste.it
nana bianca
Freapp
instal.com
Rain tomorrow?
2
Retrofit
•  Turns your REST API into a Java interface
•  Simple to use
•  JSON conversion using Gson
•  Custom converters
•   …
3
RxJava
RxJava is a Java VM implementation of ReactiveX (Reactive Extensions): a
library for composing asynchronous and event-based programs by using
observable sequences.
github.com/ReactiveX/RxJava
“
4
RxJava is not simple… 5
Demo project
github.com/fabioCollini/IntroToRetrofitRxJava
6
HTTP request definition
public interface StackOverflowService {
@GET("/users")
UserResponse getTopUsers();
}
01.
02.
03.
04.
05.
06.
7
HTTP request definition
public interface StackOverflowService {
@GET("/users")
UserResponse getTopUsers();
}
public class UserResponse {
private List<User> items;
public List<User> getItems() {
return items;
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
8
Service creation
RestAdapter restAdapter =
new RestAdapter.Builder()
01.
02.
9
Service creation
RestAdapter restAdapter =
new RestAdapter.Builder()
.setEndpoint("http://api.stackexchange.com/2.2/")
01.
02.
03.
10
Service creation
RestAdapter restAdapter =
new RestAdapter.Builder()
.setEndpoint("http://api.stackexchange.com/2.2/")
.build();
01.
02.
03.
04.
11
Service creation
RestAdapter restAdapter =
new RestAdapter.Builder()
.setEndpoint("http://api.stackexchange.com/2.2/")
.build();
StackOverflowService service =
restAdapter.create(StackOverflowService.class);
01.
02.
03.
04.
05.
06.
12
Service creation
RestAdapter restAdapter =
new RestAdapter.Builder()
.setEndpoint("http://api.stackexchange.com/2.2/")
.setRequestInterceptor(request -> {
request.addQueryParam("site", "stackoverflow");
request.addQueryParam("key", "...");
})
.build();
StackOverflowService service =
restAdapter.create(StackOverflowService.class);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
13
Synchronous request
private List<User> loadItemsSync() {
List<User> users =
service.getTopUsers().getItems();
if (users.size() > 5) {
users = users.subList(0, 5);
}
return users;
}
01.
02.
03.
04.
05.
06.
07.
08.
14
Request parameters
@GET("/users/{userId}/top-tags")
TagResponse getTags(@Path("userId") int userId);
@GET("/users/{userId}/badges")
BadgeResponse getBadges(@Path("userId") int userId);
01.
02.
03.
04.
05.
15
Request parameters
@GET("/users/{userId}/top-tags")
TagResponse getTags(@Path("userId") int userId);
@GET("/users/{userId}/badges")
BadgeResponse getBadges(@Path("userId") int userId);
service.getTags(12345);
/users/12345/top-tags?site=stackoverflow&key=…
01.
02.
03.
04.
05.
16
Other annotations
•  @GET, @POST, @PUT, @DELETE, @HEAD
•  @Path
•  @Query
•  @QueryMap
•  @Body
•  @FormUrlEncoded
•  @Field
•  @Headers
17
Composition
List<User> users = service.getTopUsers().getItems();
if (users.size() > 5) {
users = users.subList(0, 5);
}
List<UserStats> statsList = new ArrayList<>();
for (User user : users) {
TagResponse tags =
service.getTags(user.getId());
BadgeResponse badges =
service.getBadges(user.getId());
statsList.add(new UserStats(user,
tags.getItems(), badges.getItems()));
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
18
AsyncTask
new AsyncTask<Void, Void, List<User>>() {
@Override
protected List<User> doInBackground(Void... p) {
try {
return loadItemsSync();
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(List<User> users) {
if (users != null) {
adapter.addAll(users);
} else {
showError();
}
}
}.execute();
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19
Synchronous request
public interface StackOverflowService {
@GET("/users")
UserResponse getTopUsers();
}
01.
02.
03.
04.
05.
06.
20
Callbacks
public interface StackOverflowService {
@GET("/users")
void getTopUsers(Callback<UserResponse> callback);
}
01.
02.
03.
04.
05.
06.
21
Callbacks in action
service.getTopUsers(new Callback<UserResponse>() {
@Override public void success(
UserResponse userResponse, Response r) {
List<User> users = userResponse.getItems();
if (users.size() > 5)
users = users.subList(0, 5);
adapter.addAll(users);
}
@Override public void failure(RetrofitError e) {
showError();
}
});
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
22
Callbacks in action
service.getTopUsers(new Callback<UserResponse>() {
@Override public void success(
UserResponse userResponse, Response r) {
List<User> users = userResponse.getItems();
if (users.size() > 5)
users = users.subList(0, 5);
adapter.addAll(users);
}
@Override public void failure(RetrofitError e) {
showError();
}
});
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
23
Callback hell
service.getBadges(userId, new Callback<BadgeResponse>() {
@Override public void success(BadgeResponse badges, Response r) {
service.getTags(userId, new Callback<TagResponse>() {
@Override public void success(TagResponse tags, Response r) {
callback.success(new UserStats(user,
tags.getItems(), badges.getItems()), r);
}
@Override public void failure(RetrofitError error) {
callback.failure(error);
}
});
}
@Override public void failure(RetrofitError error) {
callback.failure(error);
}
});
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
24
Retrofit
public interface StackOverflowService {
@GET("/users")
void getTopUsers(Callback<UserResponse> callback);
}
01.
02.
03.
04.
05.
06.
25
Retrofit + RxJava
public interface StackOverflowService {
@GET("/users")
Observable<UserResponse> getTopUsers();
}
01.
02.
03.
04.
05.
06.
26
RxJava in action
service.getTopUsers()
.subscribe(new Action1<UserResponse>() {
@Override public void call(UserResponse r) {
List<User> users = r.getItems();
if (users.size() > 5)
users = users.subList(0, 5);
adapter.addAll(users);
}
}, new Action1<Throwable>() {
@Override public void call(Throwable t) {
showError();
}
});
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
27
Java 8 / Retrolambda
service.getTopUsers()
.subscribe(
r -> {
List<User> users = r.getItems();
if (users.size() > 5)
users = users.subList(0, 5);
adapter.addAll(users);
},
t -> showError()
);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
28
Threading
service
.getTopUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
r -> {
List<User> users = r.getItems()
if (users.size() > 5)
users = users.subList(0, 5);
adapter.addAll(users);
},
t -> showError()
);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
29
subscribe
public final Subscription subscribe(
final Action1<? super T> onNext,
final Action1<Throwable> onError) {
//...
}
01.
02.
03.
04.
05.
30
onNext | onError 31
onNext* (onComplete | onError)? 32
Observable creation
Observable.just(1, 2, 3);
33
Observable creation
Observable.just(1, 2, 3);
Observable.from(Arrays.asList("A", "B", "C", "D"));
01.
02.
34
Observable creation
Observable.just(1, 2, 3);
Observable.from(Arrays.asList("A", "B", "C", "D"));
Observable.error(new IOException());
01.
02.
03.
35
Observable creation
Observable.just(1, 2, 3);
Observable.from(Arrays.asList("A", "B", "C", "D"));
Observable.error(new IOException());
Observable.interval(5, TimeUnit.SECONDS);
01.
02.
03.
04.
36
Observable creation
Observable.just(1, 2, 3);
Observable.from(Arrays.asList("A", "B", "C", "D"));
Observable.error(new IOException());
Observable.interval(5, TimeUnit.SECONDS);
Observable.create(subscriber -> {
try {
subscriber.onNext(createFirstValue());
subscriber.onNext(createSecondValue());
subscriber.onCompleted();
} catch (Throwable t) {
subscriber.onError(t);
}
});
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
37
Observable in action
public Subscription subscribe(
Action1<? super T> onNext,
Action1<Throwable> onError,
Action0 onComplete
);
01.
02.
03.
04.
05.
38
Observable in action
public Subscription subscribe(
Action1<? super T> onNext,
Action1<Throwable> onError,
Action0 onComplete
);
Observable.just(1, 2, 3).subscribe(
System.out::println,
Throwable::printStackTrace,
() -> System.out.println("Completed")
);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
39
Observer
Observable.just(1, 2, 3)
.subscribe(new Observer<Integer>() {
@Override public void onNext(Integer i) {
System.out.println(i);
}
@Override public void onError(Throwable t) {
t.printStackTrace();
}
@Override public void onCompleted() {
System.out.println("Completed");
}
});
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
40
map 41
map
service.getTopUsers()
.subscribe(
r -> {
List<User> users = r.getItems()
if (users.size() > 5)
users = users.subList(0, 5);
adapter.addAll(users);
},
t -> showError()
);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
42
map
service.getTopUsers()
.map(r -> r.getItems())
.subscribe(
users -> {
if (users.size() > 5)
users = users.subList(0, 5);
adapter.addAll(users);
},
t -> showError()
);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
43
map
service.getTopUsers()
.map(r -> r.getItems())
.map(users -> users.size() > 5 ?
users.subList(0, 5) : users)
.subscribe(
users -> adapter.addAll(users),
t -> showError()
);
01.
02.
03.
04.
05.
06.
07.
08.
44
map
service.getTopUsers()
.map(UserResponse::getItems)
.map(users -> users.size() > 5 ?
users.subList(0, 5) : users)
.subscribe(
adapter::addAll,
t -> showError()
);
01.
02.
03.
04.
05.
06.
07.
08.
45
zip 46
zip
Observable.zip(
service.getTags(user.getId()),
service.getBadges(user.getId()),
(tags, badges) ->
new UserStats(
user, tags.getItems(), badges.getItems())
)
);
01.
02.
03.
04.
05.
06.
07.
08.
47
zip
Observable.zip(
service.getTags(user.getId()),
service.getBadges(user.getId()),
(tags, badges) ->
new UserStats(
user, tags.getItems(), badges.getItems())
)
);
01.
02.
03.
04.
05.
06.
07.
08.
48
zip
Observable.zip(
service.getTags(user.getId()),
service.getBadges(user.getId()),
(tags, badges) ->
new UserStats(
user, tags.getItems(), badges.getItems())
)
);
01.
02.
03.
04.
05.
06.
07.
08.
49
zip
Observable.zip(
service.getTags(user.getId()),
service.getBadges(user.getId()),
(tags, badges) ->
new UserStats(
user, tags.getItems(), badges.getItems())
)
);
01.
02.
03.
04.
05.
06.
07.
08.
50
zip
Observable.zip(
service.getTags(user.getId()),
service.getBadges(user.getId()),
(tags, badges) ->
new UserStats(
user, tags.getItems(), badges.getItems()
)
);
01.
02.
03.
04.
05.
06.
07.
08.
51
zip
Observable.zip(
service.getTags(user.getId())
.map(TagResponse::getItems),
service.getBadges(user.getId())
.map(BadgeResponse::getItems),
(tags, badges) ->
new UserStats(user, tags, badges)
);
01.
02.
03.
04.
05.
06.
07.
08.
52
Multi value map
Observable.just(1, 2, 3).map(
i -> Observable.just(i * 10, i * 10 + 1)
);
01.
02.
03.
53
Multi value map
Observable<Observable<Integer>> observable =
Observable.just(1, 2, 3).map(
i -> Observable.just(i * 10, i * 10 + 1)
);
01.
02.
03.
04.
54
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]]
01.
02.
03.
04.
05.
06.
07.
08.
55
flatMap 56
flatMap
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]
01.
02.
03.
04.
05.
06.
07.
08.
57
flatMap
Observable<Profile> observable =
service.login(userName, password)
.flatMap(token -> service.getProfile(token));
01.
02.
03.
58
flatMap
Observable<Profile> observable =
service.login(userName, password)
.flatMap(token -> service.getProfile(token));
Observable<Profile> observable =
service.login(userName, password)
.flatMap(service::getProfile);
01.
02.
03.
04.
05.
06.
07.
59
flatMap
service
.getTopUsers()//1<UserResponse>
01.
02.
60
flatMap
service
.getTopUsers()//1<UserResponse>
.flatMap(r -> Observable.from(r.getItems()))
//20<User>
01.
02.
03.
04.
61
flatMap
service
.getTopUsers()//1<UserResponse>
.flatMapIterable(UserResponse::getItems)//20<User>
01.
02.
03.
62
flatMap
service
.getTopUsers()//1<UserResponse>
.flatMapIterable(UserResponse::getItems)//20<User>
.limit(5)//5<User>
01.
02.
03.
04.
63
flatMap
service
.getTopUsers()//1<UserResponse>
.flatMapIterable(UserResponse::getItems)//20<User>
.limit(5)//5<User>
.flatMap(this::loadUserStats)//5<UserStats>
01.
02.
03.
04.
05.
64
flatMap
service
.getTopUsers()//1<UserResponse>
.flatMapIterable(UserResponse::getItems)//20<User>
.limit(5)//5<User>
.flatMap(this::loadUserStats)//5<UserStats>
.toList();//1<List<UserStats>>
01.
02.
03.
04.
05.
06.
65
Order is not preserved 66
flatMap source code
public final <R> Observable<R> flatMap(
Func1<
? super T,
? extends Observable<? extends R>
> func) {
return merge(map(func));
}
01.
02.
03.
04.
05.
06.
07.
67
concatMap 68
concatMap source code
public final <R> Observable<R> concatMap(
Func1<
? super T,
? extends Observable<? extends R>
> func) {
return concat(map(func));
}
01.
02.
03.
04.
05.
06.
07.
69
concatMap
service
.getTopUsers()
.flatMapIterable(UserResponse::getItems)
.limit(5)
.concatMap(this::loadUserStats)
.toList();
01.
02.
03.
04.
05.
06.
70
timeout
service
.getTopUsers()
.flatMapIterable(UserResponse::getItems)
.limit(5)
.concatMap(this::loadRepoStats)
.toList()
.timeout(20, TimeUnit.SECONDS);
01.
02.
03.
04.
05.
06.
07.
71
retry
service
.getTopUsers()
.retry(2)
.flatMapIterable(UserResponse::getItems)
.limit(5)
.concatMap(this::loadRepoStats)
.toList()
.timeout(20, TimeUnit.SECONDS)
.retry(1);
01.
02.
03.
04.
05.
06.
07.
08.
09.
72
Cache
public class Cache {
private List<UserStats> items;
public void save(List<UserStats> users) {
items = users;
}
public Observable<List<UserStats>> load(
Throwable t) {
if (items == null)
return Observable.error(t);
else
return Observable.just(items);
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
73
doOnNext / onErrorResumeNext
service.getTopUsers()
.retry(2)
.flatMapIterable(UserResponse::getItems)
.limit(5)
.concatMap(this::loadRepoStats)
.toList()
.timeout(20, TimeUnit.SECONDS)
.retry(1)
.doOnNext(cache::save)
.onErrorResumeNext(cache::load);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
74
Subscription
Observable
.interval(1, TimeUnit.SECONDS)
.timestamp()
.subscribe(System.out::println);
01.
02.
03.
04.
75
Subscription
Subscription subscription = Observable
.interval(1, TimeUnit.SECONDS)
.timestamp()
.subscribe(System.out::println);
Thread.sleep(2500);
subscription.unsubscribe();
01.
02.
03.
04.
05.
06.
07.
08.
76
Subscription
Subscription subscription = Observable
.interval(1, TimeUnit.SECONDS)
.timestamp()
.subscribe(System.out::println);
Thread.sleep(2500);
subscription.unsubscribe();
Timestamped(timestampMillis = 1429360406807, value = 0)
Timestamped(timestampMillis = 1429360407805, value = 1)
01.
02.
03.
04.
05.
06.
07.
08.
77
How many requests?
Observable<UserResponse> observable =
service.getTopUsers();
Subscription s1 = observable.subscribe(
System.out::println, Throwable::printStackTrace);
Subscription s2 = observable.subscribe(
System.out::println, Throwable::printStackTrace);
01.
02.
03.
04.
05.
06.
07.
78
How many requests?
Observable<UserResponse> observable =
service.getTopUsers();
Subscription s1 = observable.subscribe(
System.out::println, Throwable::printStackTrace);
Subscription s2 = observable.subscribe(
System.out::println, Throwable::printStackTrace);
•  2 requests
•  Retrofit Observables are cold
01.
02.
03.
04.
05.
06.
07.
79
Hot observables
Observable<UserResponse> observable =
service.getTopUsers();
ConnectableObservable<UserResponse> replayObservable
= observable.replay(1);
Subscription s1 = replayObservable.subscribe(
System.out::println, Throwable::printStackTrace);
Subscription s2 = replayObservable.subscribe(
System.out::println, Throwable::printStackTrace);
Subscription s3 = replayObservable.connect();
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
80
Activity lifecycle
@Override public View onCreateView(...) {
...
retainedFragment = RetainedFragment
.getOrCreate(getActivity());
if (retainedFragment.get() == null) {
Observable<List<T>> observable = loadItems()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
retainedFragment.bind(observable.replay(1));
}
...
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
81
Activity lifecycle
@Override public void onResume() {
super.onResume();
subscription = retainedFragment.get()
.subscribe(
this::showDataInList,
t -> showError()
);
}
@Override public void onPause() {
super.onPause();
subscription.unsubscribe();
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
82
RetainedFragment
public class RetainedFragment<T> extends Fragment {
private Subscription connectableSubscription = Subscriptions.empty();
private ConnectableObservable<T> observable;
public RetainedFragment() {
setRetainInstance(true);
}
public void bind(ConnectableObservable<T> observable) {
this.observable = observable;
connectableSubscription = observable.connect();
}
@Override public void onDestroy() {
super.onDestroy();
connectableSubscription.unsubscribe();
}
public Observable<T> get() {
return observable;
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
83
RetainedFragment
public class RetainedFragment<T> extends Fragment {
private Subscription connectableSubscription = Subscriptions.empty();
private ConnectableObservable<T> observable;
public RetainedFragment() {
setRetainInstance(true);
}
public void bind(ConnectableObservable<T> observable) {
this.observable = observable;
connectableSubscription = observable.connect();
}
@Override public void onDestroy() {
super.onDestroy();
connectableSubscription.unsubscribe();
}
public Observable<T> get() {
return observable;
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
84
RetainedFragment
public class RetainedFragment<T> extends Fragment {
private Subscription connectableSubscription = Subscriptions.empty();
private ConnectableObservable<T> observable;
public RetainedFragment() {
setRetainInstance(true);
}
public void bind(ConnectableObservable<T> observable) {
this.observable = observable;
connectableSubscription = observable.connect();
}
@Override public void onDestroy() {
super.onDestroy();
connectableSubscription.unsubscribe();
}
public Observable<T> get() {
return observable;
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
85
Thanks for your attention!
Questions?
 
github.com/fabioCollini/IntroToRetrofitRxJava
 
@fabioCollini
linkedin.com/in/fabiocollini
cosenonjaviste.it
86
@fabioCollini cosenonjaviste.it

Weitere ähnliche Inhalte

Was ist angesagt?

GKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroidGKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroidGDG Korea
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaRick Warren
 
Reactive programming with RxJava
Reactive programming with RxJavaReactive programming with RxJava
Reactive programming with RxJavaJobaer Chowdhury
 
RxJava from the trenches
RxJava from the trenchesRxJava from the trenches
RxJava from the trenchesPeter Hendriks
 
Reactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-JavaReactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-JavaKasun Indrasiri
 
Introduction to rx java for android
Introduction to rx java for androidIntroduction to rx java for android
Introduction to rx java for androidEsa Firman
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJavaSanjay Acharya
 
RxJava 2.0 介紹
RxJava 2.0 介紹RxJava 2.0 介紹
RxJava 2.0 介紹Kros Huang
 
Intro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidIntro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidEgor Andreevich
 
The Mayans Lost Guide to RxJava on Android
The Mayans Lost Guide to RxJava on AndroidThe Mayans Lost Guide to RxJava on Android
The Mayans Lost Guide to RxJava on AndroidFernando Cejas
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaKros Huang
 
Android architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta IndonesiaAndroid architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta IndonesiaPratama Nur Wijaya
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on AndroidTomáš Kypta
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaFrank Lyaruu
 

Was ist angesagt? (20)

GKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroidGKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroid
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
Reactive Java (33rd Degree)
Reactive Java (33rd Degree)Reactive Java (33rd Degree)
Reactive Java (33rd Degree)
 
Reactive programming with RxJava
Reactive programming with RxJavaReactive programming with RxJava
Reactive programming with RxJava
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
 
RxJava from the trenches
RxJava from the trenchesRxJava from the trenches
RxJava from the trenches
 
Reactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-JavaReactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-Java
 
Introduction to rx java for android
Introduction to rx java for androidIntroduction to rx java for android
Introduction to rx java for android
 
Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJava
 
RxJava 2.0 介紹
RxJava 2.0 介紹RxJava 2.0 介紹
RxJava 2.0 介紹
 
Intro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidIntro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich Android
 
The Mayans Lost Guide to RxJava on Android
The Mayans Lost Guide to RxJava on AndroidThe Mayans Lost Guide to RxJava on Android
The Mayans Lost Guide to RxJava on Android
 
RxJava Applied
RxJava AppliedRxJava Applied
RxJava Applied
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJava
 
rx-java-presentation
rx-java-presentationrx-java-presentation
rx-java-presentation
 
Introduction to Reactive Java
Introduction to Reactive JavaIntroduction to Reactive Java
Introduction to Reactive Java
 
Android architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta IndonesiaAndroid architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta Indonesia
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJava
 

Andere mochten auch

Retrofit Android by Chris Ollenburg
Retrofit Android by Chris OllenburgRetrofit Android by Chris Ollenburg
Retrofit Android by Chris OllenburgTrey Robinson
 
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 - droidconUKFabio Collini
 
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 patternFabio Collini
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Androidyo_waka
 
Android Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG FirenzeAndroid Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG FirenzeFabio Collini
 
Testable Android Apps DroidCon Italy 2015
Testable Android Apps DroidCon Italy 2015Testable Android Apps DroidCon Italy 2015
Testable Android Apps DroidCon Italy 2015Fabio Collini
 
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 MVVMFabio Collini
 
Android Widget @ whymca 2011
Android Widget @ whymca 2011Android Widget @ whymca 2011
Android Widget @ whymca 2011Fabio Collini
 
Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Fabio Collini
 
RxJava for Android - GDG and DataArt
RxJava for Android - GDG and DataArtRxJava for Android - GDG and DataArt
RxJava for Android - GDG and DataArtConstantine Mars
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + RetrofitDev2Dev
 
Dagger & rxjava & retrofit
Dagger & rxjava & retrofitDagger & rxjava & retrofit
Dagger & rxjava & retrofitTed Liang
 
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 Fabio Collini
 
Model-View-ViewModel and RxJava
Model-View-ViewModel and RxJavaModel-View-ViewModel and RxJava
Model-View-ViewModel and RxJavaFlorina Muntenescu
 
Retrofit
RetrofitRetrofit
Retrofitbresiu
 
Intro to Functional Programming with RxJava
Intro to Functional Programming with RxJavaIntro to Functional Programming with RxJava
Intro to Functional Programming with RxJavaMike Nakhimovich
 
Reactive programming with Rxjava
Reactive programming with RxjavaReactive programming with Rxjava
Reactive programming with RxjavaChristophe Marchal
 

Andere mochten auch (20)

Retrofit Android by Chris Ollenburg
Retrofit Android by Chris OllenburgRetrofit Android by Chris Ollenburg
Retrofit Android by Chris Ollenburg
 
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
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
 
Android Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG FirenzeAndroid Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG Firenze
 
Testable Android Apps DroidCon Italy 2015
Testable Android Apps DroidCon Italy 2015Testable Android Apps DroidCon Italy 2015
Testable Android Apps DroidCon Italy 2015
 
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
 
Android Widget @ whymca 2011
Android Widget @ whymca 2011Android Widget @ whymca 2011
Android Widget @ whymca 2011
 
Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
 
2 презентация rx java+android
2 презентация rx java+android2 презентация rx java+android
2 презентация rx java+android
 
RxJava for Android - GDG and DataArt
RxJava for Android - GDG and DataArtRxJava for Android - GDG and DataArt
RxJava for Android - GDG and DataArt
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
 
Dagger & rxjava & retrofit
Dagger & rxjava & retrofitDagger & rxjava & retrofit
Dagger & rxjava & retrofit
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
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
 
RxJava in practice
RxJava in practice RxJava in practice
RxJava in practice
 
Model-View-ViewModel and RxJava
Model-View-ViewModel and RxJavaModel-View-ViewModel and RxJava
Model-View-ViewModel and RxJava
 
Retrofit
RetrofitRetrofit
Retrofit
 
Intro to Functional Programming with RxJava
Intro to Functional Programming with RxJavaIntro to Functional Programming with RxJava
Intro to Functional Programming with RxJava
 
Reactive programming with Rxjava
Reactive programming with RxjavaReactive programming with Rxjava
Reactive programming with Rxjava
 

Ähnlich wie Introduction to Retrofit and RxJava

Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Fabio Collini
 
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09Daniel Bryant
 
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.0Matt Raible
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in reactBOSC Tech Labs
 
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 Andres Almiray
 
Extending Retrofit for fun and profit
Extending Retrofit for fun and profitExtending Retrofit for fun and profit
Extending Retrofit for fun and profitMatthew Clarke
 
Android dev toolbox
Android dev toolboxAndroid dev toolbox
Android dev toolboxShem Magnezi
 
softshake 2014 - Java EE
softshake 2014 - Java EEsoftshake 2014 - Java EE
softshake 2014 - Java EEAlexis Hassler
 
PUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootPUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootJosué Neis
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard IntroductionAnthony Chen
 
"Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native ""Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native "FDConf
 
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R AugeHTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Augemfrancis
 
Clean Architecture on Android
Clean Architecture on AndroidClean Architecture on Android
Clean Architecture on AndroidTianming Xu
 
RxJava With retrolambda
RxJava With retrolambdaRxJava With retrolambda
RxJava With retrolambda哲偉 楊
 
Choose Your Own Adventure with JHipster & Kubernetes - Denver JUG 2020
Choose Your Own Adventure with JHipster & Kubernetes - Denver JUG 2020Choose Your Own Adventure with JHipster & Kubernetes - Denver JUG 2020
Choose Your Own Adventure with JHipster & Kubernetes - Denver JUG 2020Matt Raible
 
Skroutz Android MVP and Adapter Delegates presentation
Skroutz Android MVP and Adapter Delegates  presentationSkroutz Android MVP and Adapter Delegates  presentation
Skroutz Android MVP and Adapter Delegates presentationgmetal
 

Ähnlich wie Introduction to Retrofit and RxJava (20)

Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2
 
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
 
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
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in react
 
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
 
Arquitecturas de microservicios - Medianet Software
Arquitecturas de microservicios   -  Medianet SoftwareArquitecturas de microservicios   -  Medianet Software
Arquitecturas de microservicios - Medianet Software
 
Codemotion appengine
Codemotion appengineCodemotion appengine
Codemotion appengine
 
Extending Retrofit for fun and profit
Extending Retrofit for fun and profitExtending Retrofit for fun and profit
Extending Retrofit for fun and profit
 
Android dev toolbox
Android dev toolboxAndroid dev toolbox
Android dev toolbox
 
Intro to Laravel 4
Intro to Laravel 4Intro to Laravel 4
Intro to Laravel 4
 
softshake 2014 - Java EE
softshake 2014 - Java EEsoftshake 2014 - Java EE
softshake 2014 - Java EE
 
PUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootPUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBoot
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard Introduction
 
"Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native ""Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native "
 
Android development
Android developmentAndroid development
Android development
 
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R AugeHTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
 
Clean Architecture on Android
Clean Architecture on AndroidClean Architecture on Android
Clean Architecture on Android
 
RxJava With retrolambda
RxJava With retrolambdaRxJava With retrolambda
RxJava With retrolambda
 
Choose Your Own Adventure with JHipster & Kubernetes - Denver JUG 2020
Choose Your Own Adventure with JHipster & Kubernetes - Denver JUG 2020Choose Your Own Adventure with JHipster & Kubernetes - Denver JUG 2020
Choose Your Own Adventure with JHipster & Kubernetes - Denver JUG 2020
 
Skroutz Android MVP and Adapter Delegates presentation
Skroutz Android MVP and Adapter Delegates  presentationSkroutz Android MVP and Adapter Delegates  presentation
Skroutz Android MVP and Adapter Delegates presentation
 

Mehr von Fabio Collini

Architectures in the compose world
Architectures in the compose worldArchitectures in the compose world
Architectures in the compose worldFabio Collini
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized projectFabio Collini
 
Managing parallelism using coroutines
Managing parallelism using coroutinesManaging parallelism using coroutines
Managing parallelism using coroutinesFabio Collini
 
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 confFabio Collini
 
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 StockholmFabio Collini
 
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 projectFabio Collini
 
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 ItalyFabio Collini
 
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 RomagnaFabio Collini
 
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 ArchitectureFabio Collini
 
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 MilanFabio Collini
 
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 TurinFabio Collini
 
Recap Google I/O 2018
Recap Google I/O 2018Recap Google I/O 2018
Recap Google I/O 2018Fabio Collini
 
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 italyFabio Collini
 
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+kFabio Collini
 
Testing Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKTesting Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKFabio Collini
 

Mehr von Fabio Collini (15)

Architectures in the compose world
Architectures in the compose worldArchitectures in the compose world
Architectures in the compose world
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 
Managing parallelism using coroutines
Managing parallelism using coroutinesManaging parallelism using coroutines
Managing parallelism using coroutines
 
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
 
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
 
Testing Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKTesting Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UK
 

Kürzlich hochgeladen

Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...tanu pandey
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdfKamal Acharya
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Standamitlee9823
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performancesivaprakash250
 
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Christo Ananth
 
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...Call Girls in Nagpur High Profile
 
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.pdfJiananWang21
 
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptxBSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptxfenichawla
 
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...Call Girls in Nagpur High Profile
 
Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)simmis5
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...ranjana rawat
 
Thermal Engineering -unit - III & IV.ppt
Thermal Engineering -unit - III & IV.pptThermal Engineering -unit - III & IV.ppt
Thermal Engineering -unit - III & IV.pptDineshKumar4165
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756dollysharma2066
 
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELLPVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELLManishPatel169454
 
Intze Overhead Water Tank Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank  Design by Working Stress - IS Method.pdfIntze Overhead Water Tank  Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank Design by Working Stress - IS Method.pdfSuman Jyoti
 

Kürzlich hochgeladen (20)

Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdf
 
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performance
 
NFPA 5000 2024 standard .
NFPA 5000 2024 standard                                  .NFPA 5000 2024 standard                                  .
NFPA 5000 2024 standard .
 
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
 
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
 
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
 
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptxBSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
 
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
 
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
 
Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
Thermal Engineering -unit - III & IV.ppt
Thermal Engineering -unit - III & IV.pptThermal Engineering -unit - III & IV.ppt
Thermal Engineering -unit - III & IV.ppt
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELLPVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
 
Intze Overhead Water Tank Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank  Design by Working Stress - IS Method.pdfIntze Overhead Water Tank  Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank Design by Working Stress - IS Method.pdf
 
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
 

Introduction to Retrofit and RxJava