RxVolley: руководство по использованию
RxVolley — это сетевая библиотека запросов, основанная на Volley и поддерживающая RxJava. Она позволяет выбирать использование OKHttp вместо стандартного HttpUrlConnection для сетевых запросов. Также есть возможность использовать функцию загрузки изображений (повторное использование сетевых запросов может эффективно уменьшить размер APK).
В RxVolley удалены HttpClient и связанные с ним API из оригинального Volley, что позволяет компилировать его в среде API 23 и выше. Библиотека также включает реализацию RxBus, которая может заменить EventBus и другие подобные библиотеки.
Планируется поддержка RxJava 2.0.
Зависимости
Для использования RxVolley необходимо добавить следующие зависимости в файл build.gradle:
compile 'com.kymjs.rxvolley:rxvolley:1.1.4'
Если вы хотите использовать OKhttp вместо стандартного HttpUrlconnection, добавьте:
compile 'com.kymjs.rxvolley:okhttp:1.1.4'
//или okhttp3 (выберите один из двух)
compile 'com.kymjs.rxvolley:okhttp3:1.1.4'
Чтобы использовать функцию загрузки изображений в RxVolley (повторное использование HTTP-модуля может эффективно уменьшить размер APK), добавьте:
compile 'com.kymjs.rxvolley:bitmapcore:1.1.4'
Реализация сетевых запросов с помощью RxVolley
Пример реализации простого GET-запроса:
// Реализация простого GET-запроса
RxVolley.get("http://www.kymjs.com/feed.xml", new HttpCallback() {
@Override
public void onSuccess(String t) {
Loger.debug("Запрос до данных:" + t);
}
});
Пример реализации POST-запроса с параметрами:
//Реализация POST-запроса с параметрами
HttpParams params = new HttpParams();
params.put("name", "kymjs");
params.put("age", 18);
params.put("image", new File("path")); //для загрузки файла
RxVolley.post("http://kymjs.com/feed.xml", params, new HttpCallback() {
@Override
public void onSuccess(String t) {
Loger.debug("Запрос до данных:" + t);
}
});
Обработка Cookie и других заголовков запроса
Пример обработки Cookie при выполнении POST-запроса для входа в систему:
// Логика входа в систему (в HttpCallback есть много перегруженных методов, можно выбрать нужный)
HttpParams params = new HttpParams();
params.put("name", "kymjs");
params.put("age", 18);
params.put("password", "helloword");
RxVolley.post("http://kymjs.com/login", params, new HttpCallback() {
@Override
public void onSuccess(Map<String, String> headers, byte[] t) {
Loger.debug("Запрос до данных:" + new String(t));
// Получение Cookie
Loger.debug("===" + headers.get("Set-Cookie"));
}
});
Пример передачи Cookie в запросе:
// Передача Cookie на сервер
HttpParams params = new HttpParams();
params.put("name", "kymjs");
params.put("age", 100);
params.putHeaders("cookie", "your cookie");
RxVolley.post("http://kymjs.com/update", params, new HttpCallback() {
@Override
public void onSuccess(String t) {
Loger.debug("Запрос до данных:" + t);
}
});
Создание сложных сетевых запросов
В отличие от описанных в разделе «Начало работы» сетевых запросов, вам могут потребоваться более сложные запросы.
Пример создания сложного сетевого запроса:
HttpParams params = new HttpParams();
// Как и раньше, для передачи заголовков HTTP можно использовать putHeaders()
params.putHeaders("cookie", "your cookie");
params.putHeaders("User-Agent", "rxvolley");
// Для передачи параметров HTTP можно использовать put()
params.put("name", "kymjs");
params.put("age", "18");
// Обработчик HTTP-запросов, который имеет множество методов.
// Включая асинхронный ответ onSuccessInAsync(), который не подходит для выполнения операций с пользовательским интерфейсом.
// Ответ на успешный сетевой запрос onSuccess().
// Ответ при неудачном сетевом запросе onFailure(), например, при отсутствии сети или ошибке сервера.
HttpCallback callback = new HttpCallback(){
@Override
public void onSuccessInAsync(byte[] t) { }
@Override
public void onSuccess(String t) { }
@Override
new public void onFailure(int errorNo, String strMsg) { }
}
ProgressListener listener = new ProgressListener(){
/**
* @param transferredBytes прогресс
* @param totalSize общий объём
*/
@Override
public void onProgress(long transferredBytes, long totalSize){ }
}
new RxVolley.Builder()
.url("http://www.kymjs.com/rss.xml") // адрес интерфейса
// Тип запроса, если не указан, по умолчанию используется GET.
// Доступные варианты: POST/PUT/DELETE/HEAD/OPTIONS/TRACE/PATCH
.httpMethod(RxVolley.Method.GET)
// Время кэширования: по умолчанию 5 минут для GET-запросов и без кэширования для POST-запросов
.cacheTime(6)
// Формат передачи содержимого, если не указано, по умолчанию FORM
.contentType(RxVolley.ContentType.FORM)
.params(params) // Созданный ранее набор параметров HttpParams
// Кэширование, по умолчанию 5 минут для GET и без кэша для POST
.shouldCache(true)
.progressListener(listener) // Прогресс загрузки
.callback(callback) // Ответ
.encoding("UTF-8") // Кодировка, по умолчанию utf-8
.doTask(); // Выполнение запроса
Поддержка RxJava
RxVolley поддерживает возврат Observable, где Result — это прототип класса:
public class Result {
public String url;
public byte[] data;
public VolleyError error;
public Map<String, String> headers;
public int errorCode;
}
Пример выполнения одного запроса и возврата Observable:
Observable<Result> observable = new RxVolley.Builder()
.url("http://www.kymjs.com/rss.xml");
``` **GET или POST/PUT/DELETE/HEAD/OPTIONS/TRACE/PATCH**
.httpMethod(RxVolley.Method.POST)
.cacheTime(6) //default: get 5min, post 0min
.params(params)
.contentType(RxVolley.ContentType.JSON)
.getResult(); // 使用getResult()来返回RxJava数据类型
//Когда получен observable объект, вы можете установить своего собственного подписчика
observable.subscribe(subscriber);
##Полный пример использования
```java
public class MainActivity extends AppCompatActivity {
private Subscription subscription;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observable<Result> observable = new RxVolley.Builder()
.url("http://kymjs.com/feed.xml")
.contentType(RxVolley.ContentType.FORM)
.getResult();
subscription = observable
.map(new Func1<Result, String>() {
@Override
public String call(Result result) {
return new String(result.data);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i("kymjs", "======网络请求结束");
}
@Override
public void onError(Throwable e) {
Log.i("kymjs", "======网络请求失败" + e.getMessage());
}
@Override
public void onNext(String s) {
Log.i("kymjs", "======网络请求" + s);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (subscription != null && subscription.isUnsubscribed()) {
subscription.unsubscribe();
}
}
}
##Пользовательский запрос
Возможно, вы являетесь активным пользователем Volley (как и я), тогда вам наверняка нравится его гибкость.
Вы можете создать подкласс Request<?> и свободно настраивать стратегию запроса, стратегию кэширования, шифрование передачи данных, стратегию повтора и т. д.
Наконец, выполните свой пользовательский запрос с помощью:
RxVolley.Builder().setRequest(yourRequest).doTask();
Вот пример типичного пользовательского запроса:
/**
* Form表单形式的Http请求
*/
public class FormRequest extends Request<byte[]> {
private final HttpParams mParams;
public FormRequest(RequestConfig config, HttpParams params, HttpCallback callback) {
super(config, callback);
if (params == null) {
params = new HttpParams();
}
this.mParams = params;
}
@Override
public String getCacheKey() {
if (getMethod() == RxVolley.Method.POST) {
return getUrl() + mParams.getUrlParams();
} else {
return getUrl();
}
}
@Override
public String getBodyContentType() {
if (mParams.getContentType() != null) {
return mParams.getContentType();
} else {
return super.getBodyContentType();
}
}
@Override
public ArrayList<HttpParamsEntry> getHeaders() {
return mParams.getHeaders();
}
@Override
public byte[] getBody() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
mParams.writeTo(bos);
} catch (IOException e) {
Loger.debug("FormRequest#getBody()--->IOException writing to ByteArrayOutputStream");
}
return bos.toByteArray();
}
@Override
public Response<byte[]> parseNetworkResponse(NetworkResponse response) {
return Response.success(response.data, response.headers,
HttpHeaderParser.parseCacheHeaders(getUseServerControl(), getCacheTime(),
response));
}
@Override
protected void deliverResponse(ArrayList<HttpParamsEntry> headers, final byte[] response) {
if (mCallback != null) {
HashMap<String, String> map = new HashMap<>(headers.size());
for (HttpParamsEntry entry : headers) {
map.put(entry.k, entry.v);
}
``` **mCallback.onSuccess(map, response);**
@Override public Priority getPriority() { return Priority.IMMEDIATE; }
## Файл (картинка) загрузка
С помощью пользовательского запроса RxVolley в библиотеке встроена функция загрузки файлов. Вы можете использовать:
```java
// Загрузка прогресса (необязательный параметр, если не нужно, можно не передавать)
listener = new ProgressListener() {
@Override
public void onProgress(long transferredBytes, long totalSize) {
Loger.debug(transferredBytes + "======" + totalSize);
}
};
// Обратные вызовы для загрузки, включая множество методов, пожалуйста, обратитесь к исходному коду для получения подробной информации
// Включая асинхронный ответ onSuccessInAsync(): обратите внимание, что нельзя выполнять операции с пользовательским интерфейсом
// Обратный вызов при успешной загрузке onSuccess()
// Обратный вызов при неудачной загрузке onFailure(): например, без сети, серверная ошибка и т. д.
HttpCallback callback = new HttpCallback(){
@Override
public void onSuccessInAsync(byte[] t) {
}
@Override
public void onSuccess(String t) {
}
@Override
public void onFailure(int errorNo, String strMsg) {
}
};
RxVolley.download(FileUtils.getSDCardPath() + "/a.apk",
"https://www.oschina.net/uploads/osc-android-app-2.4.apk",
listener, callback);
Поскольку было сказано, что функция «загрузки» создана с помощью пользовательского запроса RxVolley, давайте посмотрим на его реализацию метода:
/**
* Загрузка
*
* @param storeFilePath Абсолютный путь к локальному хранилищу
* @param url URL файла для загрузки
* @param progressListener Обратный вызов для загрузки прогресса
* @param callback Загрузка обратного вызова
*/
public static void download(String storeFilePath, String url, ProgressListener
progressListener, HttpCallback callback) {
RequestConfig config = new RequestConfig();
config.mUrl = url;
FileRequest request = new FileRequest(storeFilePath, config, callback);
request.setOnProgressListener(progressListener);
new Builder().setRequest(request).doTask();
}
Теоретически все настройки запросов могут быть выполнены с помощью настраиваемого запроса. Однако, если вы, как и я, ленивый человек, конечно, вы бы предпочли, чтобы эти вещи уже были сделаны кем-то другим.
По умолчанию путь кэширования файлов находится в корневом каталоге SD-карты /RxVolley папка, вы можете установить свой cacheFolder с помощью следующего оператора:
RxVolley.setRequestQueue(RequestQueue.newRequestQueue(cacheFolder));
Следует отметить, что метод setRequestQueue должен вызываться перед BitmapCore.Build() и RxVolley.Build(), то есть перед использованием RxVolley сначала установите конфигурацию. Рекомендуется завершить эти настройки в классе Application.
Если не установлено, по умолчанию доверяют всем сертификатам HTTPS. Можно передать пользовательский SSLSocketFactory
:
RxVolley.setRequestQueue(RequestQueue.newRequestQueue(cacheFolder), new HttpConnectStack(null, sslSocketFactory));
Следует отметить, что метод setRequestQueue должен вызываться до RxVolley.Build(), то есть перед использованием RxVolley сначала настройте конфигурацию. Рекомендуется выполнить эти настройки в классе Application.
Пример настройки SSLSocketFactory:
// Сертификат для скачивания помещается в каталог assets проекта
InputStream ins = context.getAssets().open("app_pay.cer");
CertificateFactory cerFactory = CertificateFactory
.getInstance("X.509");
Certificate cer = cerFactory.generateCertificate(ins);
KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
keyStore.load(null, null);
keyStore.setCertificateEntry("trust", cer);
SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore);
RxVolley.setRequestQueue(RequestQueue.newRequestQueue(RxVolley.CACHE_FOLDER), new HttpConnectStack(null, sslSocketFactory));
// Время ожидания запроса
timeout()
// Для более реалистичного моделирования сети, если данные считываются из кэша, задержка на некоторое время перед возвратом данных из кэша
delayTime()
// Срок действия кэша в минутах
cacheTime()
// Использовать срок действия, управляемый сервером, то есть срок действия cookie
// (если используется управление сервером, игнорируется #cacheTime())
useServerControl()
// Включить кэш
shouldCache()
// Политика повторного подключения, стратегия повторного подключения Volley по умолчанию — timeout=3000, повторная попытка один раз
retryPolicy()
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )