RxJava + Retrofit

40
RxJava + Retrofit Дмитрий Чернов Android developer 1

Transcript of RxJava + Retrofit

Page 1: RxJava + Retrofit

RxJava + RetrofitДмитрий Чернов

Android developer

1

Page 2: RxJava + Retrofit

Введение

Если коротко, то:

1. Retrofit - расширение для работы с REST API.

2. RxJava - библиотека для организации работы с

потоками данных.

2

Page 3: RxJava + Retrofit

Retrofit

3

Page 4: RxJava + Retrofit

Принимаемый объект

{

"title" : "Title of journal",

"description" : "Short description of journal ",

"image" : "Url for cover journal"

}

4

Page 5: RxJava + Retrofit

Описание модели данныхpublic class Journal {

private String title;

private String description;

private String image;

public void setTitle(String title) {

this.title = title;

}

...

public String getImage() {

return image;

}

...

5

Page 6: RxJava + Retrofit

Структура запросов

public interface Api {

@POST("/{url}")

public Journal getJournalInfo(@Path("url") String url);

}

6

Page 7: RxJava + Retrofit

Структура запросов

public interface Api {

@POST("/{url}")

public Journal getJournalInfo(@Path("url") String url);

@GET("/users/list?sort=desc")

List<User> getList();

}

7

Page 8: RxJava + Retrofit

Добавление заголовков@Headers("Cache-Control: max-age=640000")

@GET("/user/list")

List<User> userList();

@Headers({

"Accept: application/vnd.github.v3.full+json",

"User-Agent: Retrofit-Sample-App"})

@GET("/users/{id}")

User getUser(@Path("id") long userId);

@GET("/user")

void getUser(@Header("Authorization") String authorization, Callback<User>

callback);8

Page 9: RxJava + Retrofit

Добавление заголовковRequestInterceptor ri = new RequestInterceptor() {

@Override

public void intercept(RequestFacade request) {

request.addHeader("User-Agent", "MyApp");

}

};

RestAdapter restAdapter = new RestAdapter.Builder()

.setEndpoint("https://api.github.com")

.setRequestInterceptor(ri)

.build();

9

Page 10: RxJava + Retrofit

Выполнение запросовApi api = restAdapter.create(Api.class);

Url economics = Url.ECONOMICS;

Journal journal = api.getJournalInfo(economics.getUrl());

System.out.println("title : " + journal.getTitle());

10

Page 11: RxJava + Retrofit

Синхронное/асинхронное получение данныхpublic interface Api {

@GET("/user/{id}/photo")

Photo getUserPhoto(@Path("id") int id);

@GET("/user/{id}/photo")

void getUserPhoto(@Path("id") int id, Callback<Photo> cb);

}

11

Page 12: RxJava + Retrofit

Синхронное/асинхронное получение данных

public interface Api {

@GET("/user/{id}/photo")

Observable<Photo> getUserPhoto(@Path("id") int id);

}

12

Page 13: RxJava + Retrofit

requestDataTask = new AsyncTask<Void, Void, JSONObject>() {

@Override

protected JSONObject doInBackground(Void... params) {

final String requestResult = apiService.getData();

}

};

Пример организации сетевого запроса

13

Page 14: RxJava + Retrofit

requestDataTask = new AsyncTask<Void, Void, JSONObject>() {

@Override

protected JSONObject doInBackground(Void... params) {

final String requestResult = apiService.getData();

final JSONObject json = JsonUtils.parse(requestResult);

}

};

Пример организации сетевого запроса

14

Page 15: RxJava + Retrofit

requestDataTask = new AsyncTask<Void, Void, JSONObject>() {

@Override

protected JSONObject doInBackground(Void... params) {

final String requestResult = apiService.getData();

final JSONObject json = JsonUtils.parse(requestResult);

cacheJson(json);

return json;

}

};

Пример организации сетевого запроса

15

Page 16: RxJava + Retrofit

Впечатления о работе с AsyncTask

16

Page 17: RxJava + Retrofit

RxJava

17

Page 18: RxJava + Retrofit

RxJava

Центральные объекты RxJava:

• Observable

18

Page 19: RxJava + Retrofit

RxJava

Центральные объекты RxJava:

• Observable

• Subscriber

19

Page 20: RxJava + Retrofit

Observable

Observable<String> myObservable = Observable.create(

new Observable.OnSubscribe<String>() {

@Override

public void call(Subscriber<? super String> sub) {

sub.onNext("Hello, world!");

sub.onCompleted();

}

}

);

20

Page 21: RxJava + Retrofit

Subscriber

Subscriber<String> mySubscriber = new Subscriber<String>() {

@Override

public void onNext(String s) { System.out.println(s); }

@Override

public void onCompleted() { }

@Override

public void onError(Throwable e) { }

}; 21

Page 22: RxJava + Retrofit

Observable + Subscriber

22

myObservable.subscribe(mySubscriber);

Page 23: RxJava + Retrofit

Observable + Subscriber

Subscription s = myObservable.subscribe(mySubscriber);

23

Page 24: RxJava + Retrofit

Observable + Subscriber

Subscription s = myObservable.subscribe(mySubscriber);

s.unsubscribe();

24

Page 25: RxJava + Retrofit

Работа с операторами

Observable.just("Hello, world!")

.subscribe(s -> System.out.println(s));

25

Page 26: RxJava + Retrofit

Работа с операторами

Observable.just("Hello, world!")

.map(new Func1<String, String>() {

@Override

public String call(String s) {

return s + " -Dan";

}

})

.subscribe(s -> System.out.println(s));

26

Page 27: RxJava + Retrofit

27

Page 28: RxJava + Retrofit

28

Page 29: RxJava + Retrofit

29

Page 30: RxJava + Retrofit

30

Page 31: RxJava + Retrofit

31

Page 32: RxJava + Retrofit

Сетевой запрос RxAndroidSubscription s =

createApiRequestObservable()

.subscribe(mySubscriber);

32

Page 33: RxJava + Retrofit

Сетевой запрос RxAndroidSubscription s =

createApiRequestObservable()

.timeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)

.retry(RETRY_COUNT_FOR_REQUEST)

.subscribe(mySubscriber);

33

Page 34: RxJava + Retrofit

Сетевой запрос RxAndroidSubscription s =

createApiRequestObservable()

.timeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)

.retry(RETRY_COUNT_FOR_REQUEST)

.onErrorResumeNext(createRequestErrorHandler())

.map(createJsonMapOperator())

.subscribe(mySubscriber);

34

Page 35: RxJava + Retrofit

Сетевой запрос RxAndroidSubscription s =

createApiRequestObservable()

.timeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)

.retry(RETRY_COUNT_FOR_REQUEST)

.onErrorResumeNext(createRequestErrorHandler())

.map(createJsonMapOperator())

.onErrorReturn(createJsonErrorHandler())

.doOnNext(createCacheOperation())

.subscribe(mySubscriber);

35

Page 36: RxJava + Retrofit

Сетевой запрос RxAndroidSubscription s =

createApiRequestObservable()

.timeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)

.retry(RETRY_COUNT_FOR_REQUEST)

.onErrorResumeNext(createRequestErrorHandler())

.map(createJsonMapOperator())

.onErrorReturn(createJsonErrorHandler())

.doOnNext(createCacheOperation())

.subscribeOn(Schedulers.newThread())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(mySubscriber);

36

Page 37: RxJava + Retrofit

37

Page 38: RxJava + Retrofit

Итог

Код становится:

• понятный

• гибкий

• легко расширяемый

38

Page 39: RxJava + Retrofit

Ссылки:

• http://square.github.io/retrofit/ - Retrofit

• https://github.com/ReactiveX/RxJava - RxJava

39

Page 40: RxJava + Retrofit

ВОПРОСЫ?