View
499
Download
1
Category
Preview:
Citation preview
RxJava + RetrofitДмитрий Чернов
Android developer
1
Введение
Если коротко, то:
1. Retrofit - расширение для работы с REST API.
2. RxJava - библиотека для организации работы с
потоками данных.
2
Retrofit
3
Принимаемый объект
{
"title" : "Title of journal",
"description" : "Short description of journal ",
"image" : "Url for cover journal"
}
4
Описание модели данных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
Структура запросов
public interface Api {
@POST("/{url}")
public Journal getJournalInfo(@Path("url") String url);
}
6
Структура запросов
public interface Api {
@POST("/{url}")
public Journal getJournalInfo(@Path("url") String url);
@GET("/users/list?sort=desc")
List<User> getList();
}
7
Добавление заголовков@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
Добавление заголовков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
Выполнение запросовApi api = restAdapter.create(Api.class);
Url economics = Url.ECONOMICS;
Journal journal = api.getJournalInfo(economics.getUrl());
System.out.println("title : " + journal.getTitle());
10
Синхронное/асинхронное получение данных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
Синхронное/асинхронное получение данных
public interface Api {
@GET("/user/{id}/photo")
Observable<Photo> getUserPhoto(@Path("id") int id);
}
12
requestDataTask = new AsyncTask<Void, Void, JSONObject>() {
@Override
protected JSONObject doInBackground(Void... params) {
final String requestResult = apiService.getData();
}
};
Пример организации сетевого запроса
13
requestDataTask = new AsyncTask<Void, Void, JSONObject>() {
@Override
protected JSONObject doInBackground(Void... params) {
final String requestResult = apiService.getData();
final JSONObject json = JsonUtils.parse(requestResult);
}
};
Пример организации сетевого запроса
14
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
Впечатления о работе с AsyncTask
16
RxJava
17
RxJava
Центральные объекты RxJava:
• Observable
18
RxJava
Центральные объекты RxJava:
• Observable
• Subscriber
19
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
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
Observable + Subscriber
22
myObservable.subscribe(mySubscriber);
Observable + Subscriber
Subscription s = myObservable.subscribe(mySubscriber);
23
Observable + Subscriber
Subscription s = myObservable.subscribe(mySubscriber);
s.unsubscribe();
24
Работа с операторами
Observable.just("Hello, world!")
.subscribe(s -> System.out.println(s));
25
Работа с операторами
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
27
28
29
30
31
Сетевой запрос RxAndroidSubscription s =
createApiRequestObservable()
.subscribe(mySubscriber);
32
Сетевой запрос RxAndroidSubscription s =
createApiRequestObservable()
.timeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)
.retry(RETRY_COUNT_FOR_REQUEST)
.subscribe(mySubscriber);
33
Сетевой запрос RxAndroidSubscription s =
createApiRequestObservable()
.timeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)
.retry(RETRY_COUNT_FOR_REQUEST)
.onErrorResumeNext(createRequestErrorHandler())
.map(createJsonMapOperator())
.subscribe(mySubscriber);
34
Сетевой запрос 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
Сетевой запрос 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
37
Итог
Код становится:
• понятный
• гибкий
• легко расширяемый
38
Ссылки:
• http://square.github.io/retrofit/ - Retrofit
• https://github.com/ReactiveX/RxJava - RxJava
39
ВОПРОСЫ?
Recommended