Мне необходимо спроектировать Rest Api приложение. В интернете, в том числе в официальной документации показаны примеры использования данной библиотеки выполняя запросы напрямую из Activity, но это ведь неправильно?! Сетевые запросы нужно выполнять с помощью Service?! Как правильно это сделать c помощью Retrofit? Не хочу выдумывать свой "Велосипед".
Ответ
В официальной документации делается акцент на то, чтобы показать как использовать данную библиотеку, а не на то как лучше спроектировать приложение.
Я, например, использую связку retrofit+rxjava+eventbus и работаю по следующей схеме: методы ретрофита возвращают Observable
public class RestInteractionWorker {
RestServerInterface restInterface;
public RestInteractionWorker(){
//создаем объект RestServerInterface
}
public void perfomServerOperation(){
restInterface.perfomOperation(...)
.subscribeOn(Schedulers.newThread()) //для запроса используем отдельный поток
.timeout(30, TimeUnit.SECONDS) // таймаут
.map(new Func1
// обрабатываем результат, после чего высылаем событие с флагом успешного выполнения запроса
return event;
}
})
.onErrorReturn(new Func1
Интерфейс запросов к серверу выглядит так:
public interface RestServerInterface {
@GET("/...")
Observable
Вместо T надо указать конкретный тип, который будет возвращен.
Данную модель я использую когда надо получить данные сервера и сохранить их в базу данных, после чего в приложении отобразить новые обновленные данные. В методе map(...) я сохраняю данные в бд, и возвращаю из него event с флагом успешной загрузки и сохранения данных, после чего в методе subscribe(...) высылаю это событие. В дальнейшем это событие перехватывает тот кто на него подписан и обновляет данные.
Метод onErrorReturn(...) перехватывает все исключения которые произошли во время выполнения.
Если не нужно сохранять данные в бд, а, например, сразу выслать модельный объект, то метод map(...) можно не реализовывать.
Классы событий выглядят примерно следующим образом:
public class ActionEvent {
private final boolean isSuccessefull;
private final String message;
//можно передавать дополнительную информацию
public ActionEvent(boolean isSuccessefull, String message) {
this.isSuccessefull = isSuccessefull;
this.message = message;
public boolean isSUccessefull() {
return isSUccessefull;
}
public String getMessage() {
return message;
}
}
В активити/фрагменте обрабатываю события так:
public void onEvent(ActionEvent event) {
//обработка результата
}
public void onResume(){
EventBus.getDefault().register(this); // подписываемся на прием событий
super.onResume();
}
public void onPause(){
EventBus.getDefault().unregister(this); // отписываемся от получения событий
super.onPause();
}
Новичку данная модель может показаться сложноватой из-за использования библиотеки rxJava, но в целом для меня это довольно успешная модель реализации взаимодействия приложения с сервером.
Refrofit можно так же использовать в связке с Robospise. В ней как раз все запросы выполняются через Service. Пример можно найти в их репозиторие.
Комментариев нет:
Отправить комментарий