1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/kymjs-RxVolley

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Readme_zh.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 20:08 1250c01

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);

download() прототип

Поскольку было сказано, что функция «загрузки» создана с помощью пользовательского запроса 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

Если не установлено, по умолчанию доверяют всем сертификатам 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));

Build() дополнительные настройки

  • Пожалуйста, обратитесь к классу RxVolley$Builder для более подробной информации.
// Время ожидания запроса  
timeout()    

// Для более реалистичного моделирования сети, если данные считываются из кэша, задержка на некоторое время перед возвратом данных из кэша  
delayTime()   

// Срок действия кэша в минутах  
cacheTime()  

// Использовать срок действия, управляемый сервером, то есть срок действия cookie  
// (если используется управление сервером, игнорируется #cacheTime())  
useServerControl()   

// Включить кэш  
shouldCache()  

// Политика повторного подключения, стратегия повторного подключения Volley по умолчанию — timeout=3000, повторная попытка один раз  
retryPolicy()  

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/kymjs-RxVolley.git
git@api.gitlife.ru:oschina-mirror/kymjs-RxVolley.git
oschina-mirror
kymjs-RxVolley
kymjs-RxVolley
master