• Github:https://github.com/kymjs/RxVolley
  • RxVolley使用文档 V1.0:http://rxvolley.mydoc.io/

一.RxVolley使用指南

1.概述

RxVolley是一个基于Volley的网络请求库;同时支持RxJava;可以选择使用OKHttp替代默认的 HttpUrlConnection 做网络请求;可以选择使用图片加载功能(复用的网络请求将有效减少apk体积);移除了原Volley的 HttpClient 相关 API ,可在 API23 环境编译;内置了RxBus的实现,可有效替换掉EventBus等相关库;

2.依赖

使用RxVolley,需要在你的build.gradle文件中加入

compile 'com.kymjs.rxvolley:rxvolley:1.0.7'

如果你还想使用OKhttp来替代默认的HttpUrlconnection,需要加入

compile 'com.kymjs.rxvolley:okhttp:1.0.7'

如果你想使用RxVolley的图片加载功能(复用http模块可以有效减少apk大小),需要加入

compile 'com.kymjs.rxvolley:bitmapcore:1.0.7'

使用 RxVolley 做网络请求

3.简单实现

//get请求简洁版实现
RxVolley.get("http://www.kymjs.com/feed.xml", new HttpCallback() {@Overridepublic void onSuccess(String t) {Loger.debug("请求到的数据:" + t);}
});//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() {@Overridepublic void onSuccess(String t) {Loger.debug("请求到的数据:" + t);}
});

4.对Cookie等请求头的处理

//用户登录逻辑(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() {@Overridepublic void onSuccess(Map<String, String> headers, byte[] t) {Loger.debug("请求到的数据:" + new String(t));// 获取到的cookieLoger.debug("===" + headers.get("Set-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() {@Overridepublic void onSuccess(String t) {Loger.debug("请求到的数据:" + t);}
});

比起 入门 章节讲述的网络请求,你可能希望有更多的需求

5.构建网络请求

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():注不能做UI操作
//网络请求成功时的回调onSuccess()
//网络请求失败时的回调onFailure():例如无网络,服务器异常等
HttpCallback callback = new HttpCallback(){@Overridepublic void onSuccessInAsync(byte[] t) {}@Overridepublic void onSuccess(String t) {}@Overridepublic void onFailure(int errorNo, String strMsg) {}
}ProgressListener listener = new ProgressListener(){/*** @param transferredBytes 进度* @param totalSize 总量*/@Overridepublic 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) //设置缓存时间: 默认是 get 请求 5 分钟, post 请求不缓存  .cacheTime(6) //内容参数传递形式,如果不加,默认为 FORM 表单提交,可选项 JSON 内容
    .contentType(RxVolley.ContentType.FORM).params(params) //上文创建的HttpParams请求参数集//是否缓存,默认是 get 请求 5 缓存分钟, post 请求不缓存.shouldCache(true) .progressListener(listener) //上传进度.callback(callback) //响应回调.encoding("UTF-8") //编码格式,默认为utf-8.doTask();  //执行请求操作

6.对 RxJava 的支持

RxVolley 支持返回一个 Observable 类型的数据,如下是 Result 类的原型

public class Result {public Map<String, String> header;public byte[] data;public Result(Map<String, String> header, byte[] data) {this.header = header;this.data = data;}
}

执行一次请求,并返回 Observable

Observable<Result> observable = new RxVolley.Builder().url("http://www.kymjs.com/rss.xml")//default GET or 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 对象后,你可以设置你自己的 subscriber
observable.subscribe(subscriber);

完整的使用示例

public class MainActivity extends AppCompatActivity {private Subscription subscription;@Overrideprotected 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>() {@Overridepublic String call(Result result) {return new String(result.data);}}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<String>() {@Overridepublic void call(String result) {Log.i("kymjs", "======网络请求" + result);}});}@Overrideprotected void onDestroy() {super.onDestroy();if (subscription != null && subscription.isUnsubscribed()) {subscription.unsubscribe();}}
}

7.自定义请求

也许你是 Volley 的重度使用者(就像我),那么你一定是因为 Volley 自由的扩展性而爱上它的。
你可以通过创建一个Request

RxVolley.Builder().setRequest(yourRequest).doTask();

去执行你的自定义 Request一个典型自定义Request的示例:

/*** 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;}@Overridepublic String getCacheKey() {if (getMethod() == RxVolley.Method.POST) {return getUrl() + mParams.getUrlParams();} else {return getUrl();}}@Overridepublic String getBodyContentType() {if (mParams.getContentType() != null) {return mParams.getContentType();} else {return super.getBodyContentType();}}@Overridepublic ArrayList<HttpParamsEntry> getHeaders() {return mParams.getHeaders();}@Overridepublic byte[] getBody() {ByteArrayOutputStream bos = new ByteArrayOutputStream();try {mParams.writeTo(bos);} catch (IOException e) {Loger.debug("FormRequest#getBody()--->IOException writing to ByteArrayOutputStream");}return bos.toByteArray();}@Overridepublic Response<byte[]> parseNetworkResponse(NetworkResponse response) {return Response.success(response.data, response.headers,HttpHeaderParser.parseCacheHeaders(getUseServerControl(), getCacheTime(),response));}@Overrideprotected 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);}}@Overridepublic Priority getPriority() {return Priority.IMMEDIATE;}
}

8.文件(图片)下载

利用 RxVolley 的自定义请求,在库中内置了文件下载功能。你可以使用

//下载进度(可选参数,不需要可不传)
listener = new ProgressListener() {@Overridepublic void onProgress(long transferredBytes, long totalSize) {Loger.debug(transferredBytes + "======" + totalSize);}
}//下载回调,内置了很多方法,详细请查看源码
//包括在异步响应的onSuccessInAsync():注不能做UI操作
//下载成功时的回调onSuccess()
//下载失败时的回调onFailure():例如无网络,服务器异常等
HttpCallback callback = new HttpCallback(){@Overridepublic void onSuccessInAsync(byte[] t) {}@Overridepublic void onSuccess(String t) {}@Overridepublic 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, ProgressListenerprogressListener, HttpCallback callback) {RequestConfig config = new RequestConfig();config.mUrl = url;FileRequest request = new FileRequest(storeFilePath, config, callback);request.setOnProgressListener(progressListener);new Builder().setRequest(request).doTask();}

9.更多可选设置

理论上来说,一切的请求设置都可以通过自定义 Request 来完成。
但是,如果你和我一样是个懒人,当然更希望这些早就有人已经做好了。

  • 设置文件缓存的路径
默认的文件缓存路径是在SD卡根目录的 /RxVolley 文件夹下,你可以通过如下语句设置你的 cacheFolder

RxVolley.setRequestQueue(RequestQueue.newRequestQueue(cacheFolder));

需要注意的是,setRequestQueue 方法必须在 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,重试1次
retryPolicy()

二.Cookie持久化封装

RxVolley 默认对于 cookie 的操作是会从 HttpCallback 中返回 cookie,需要手动保存到本地。
如果你希望框架能够自动存储 cookie,可以这么做:按需要选择继承FormRequest或者JsonRequest (直接继承 Request 类也可以,但是复杂) 并重写

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

逻辑如上述代码,其中的map即包含了服务器返回的cookie,可以做你自己的操作了。
最终执行你的自定义 Request

new RxVolley.Builder().setRequest(xxxxx).doTask();

在传递 Cookie 作为请求头的时候,建议写一个工具类,例如

public static HttpParams getHttpParams() {HttpParams params = new HttpParams();params.putHeader("cookie");return params;
}

三.使用 OkHttp

使用 OkHttp 替代HttpUrlconnection

Volley 允许你创建自己的网络请求执行器,执行器需要实现IHttpStack接口RxVolley 的 okhttp module 已经有了使用 OkHttp 作为请求执行器的实现。你可以使用如下代码设置,依旧需要注意的是,setRequestQueue 方法必须在 RxVolley.Build() 方法执行之前调用,也就是在使用 RxVolley 以前先设置配置信息。建议在 Application 类中完成这些设置。

RxVolley.setRequestQueue(RequestQueue.newRequestQueue(RxVolley.CACHE_FOLDER, new OkHttpStack(new OkHttpClient())));

使用 OkHttp 相关功能需要在你的 build.gradle 文件中加入

compile 'com.kymjs.rxvolley:okhttp:1.0.5'

四.Issue反馈

  • https://github.com/kymjs/RxVolley/issues

Android RxVolley = Volley + RxJava + OkHttp相关推荐

  1. android volley post 参数,android – 使用Volley POST传递参数

    我能够使用Postman和这些参数调用HTTP端点: { "name":"Val", "subject":"Test" ...

  2. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github:  https://github.com/ReactiveX/RxJava  https://githu ...

  3. 请求参数 统一 管理 java_Retrofit+Rxjava+okhttp基本操作和统一处理 – R...

    Retrofit+Rxjava+okhttp基本操作和统一处理的demo 1.Retrofit+Rxjava+okhttp基本使用方法 2.统一处理请求数据格式 3.统一的ProgressDialog ...

  4. android项目中使用的服务器上,android 开发中使用okhttp上传文件到服务器

    开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片. 使用okhttp会是一个很好的选择.它使用很简单,而且运行效率也很高. 首先,在 app/build.gradle 的 ...

  5. Android客户端连接服务器- OKHttp的简单实用方法

    文章目录 一 .OKHttp简介 二. OkHttp3使用 1.创建HTTPClient实例 2.Get请求 3.POST请求 三.Timeouts(超时) **写在前面:本文只是对OKHttp3的简 ...

  6. http://a.codekk.com/detail/Android/grumoon/Volley 源码解析

    http://a.codekk.com/detail/Android/grumoon/Volley 源码解析

  7. 扔物线------给 Android 开发者的 RxJava 详解

    本文转载自扔物线的文章:http://gank.io/post/560e15be2dca930e00da1083 给 Android 开发者的 RxJava 详解 <p>作者:<a ...

  8. Android 开发者的 RxJava 详解 - 作者:扔物线

    前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近 ...

  9. 给 Android 开发者的 RxJava 详解(作者:扔物线)

    前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近 ...

  10. android项目集成okgo,Android中MVP+RXJAVA+OKGO框架

    [实例简介] Android中MVP+RXJAVA+OKGO框架 Glide的封装 沉浸式状态栏 butterknife 和recyclerview的使用 [实例截图] [核心代码] 882096ee ...

最新文章

  1. ASP.NET Core身份认证服务框架IdentityServer4(2)-整体介绍
  2. pytorch 矩阵相乘_深入浅出PyTorch(算子篇)
  3. C语言 socket listen()函数(socket()函数创建的socket(套接字描述符)默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求)
  4. python反向缩进_在Pycharm中对代码进行注释和缩进的方法详解
  5. JVM性能调优监控工具总结
  6. Spring.Resource与Spring资源获取方式
  7. WCF中使用控件的委托,线程中的UI委托
  8. 工作总结5:插槽的使用
  9. 1.9 编程基础之二分查找 12 最长平台 python
  10. 关于页面文件路径的问题
  11. python爬虫案例-乌托家家具公司数据爬取
  12. 计算机无法安装蓝牙驱动,win7电脑蓝牙驱动怎么安装,教您怎么安装
  13. android apk更新下载以及安装
  14. 平行云CEO 李岩:CloudXR ,开启通往元宇宙的通道
  15. 论初唐诗人的历史地位-上官仪、王勃、杨炯、陈子昂、杜审言
  16. 经验:中小微企业网站上云怎样选择适合自己的云虚拟主机?
  17. PHP微信小程序用户昵称带表情符存储
  18. 上海社保金额精确计算公式
  19. 如果说这个世界不是真实存在的,只是一段代码,迄今为止你发现了哪些bug?
  20. 解决vim与外界的复制粘贴(不用安装插件)

热门文章

  1. 解密《一个操作系统的实现》这本书
  2. 入门不简单(《Beginning C# Objects中文版》书评)
  3. 数据结构与算法(一):线性表、栈、树(二叉树,AVL树)、图
  4. matlab信息量估计法估计嵌入率,LSB密写分析-信息量估计法
  5. jersey tomcat MySQL_IDEA+Jersey+Tomcat搭建RESTful API
  6. oracle数据库如何写翻页_ORACLE翻页SQL语句
  7. 7-4 三角形判断 (15 分)
  8. SQL Server — 更改数据库名
  9. Android 饼状图(MPAndroidChart框架)
  10. rk3399_android7.1 USB Type-A的配置