RxHttp 让你眼前一亮的Http请求框架( 六 )

注:上面带进度断点下载中,返回的进度会从0开始,如果需要衔接上次下载的进度,则调用asDownload(String,long,Consumer,Scheduler)方法传入上次已经下载好的长度(第二个参数),如下:
String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";long length = new File(destPath).length(); //已下载的文件长度RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk").setRangeHeader(length)//设置开始下载位置,结束位置默认为文件末尾.asDownload(destPath, length, progress -> {//下载进度回调,0-100,仅在进度有更新时才会回调int currentProgress = progress.getProgress(); //当前进度 0-100long currentSize = progress.getCurrentSize(); //当前已下载的字节大小long totalSize = progress.getTotalSize();//要下载的总字节大小}, AndroidSchedulers.mainThread()) //指定主线程回调.subscribe(s -> { //s为String类型//下载成功,处理相关逻辑}, throwable -> {//下载失败,处理相关逻辑});3.9、超时设置3.9.1、设置全局超时
RxHttp内部默认的读、写、连接超时时间均为10s,如需修改,请自定义OkHttpClient对象,如下:
//设置读、写、连接超时时间为15sOkHttpClient client = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).writeTimeout(15, TimeUnit.SECONDS).build();RxHttp.init(client);3.9.2、为单个请求设置超时
为单个请求设置超时,使用的是RxJava的timeout(long timeout, TimeUnit timeUnit)方法,如下:
RxHttp.get("/service/...").asString().timeout(5, TimeUnit.SECONDS)//设置总超时时间为5s.as(RxLife.asOnMain(this))//感知生命周期,并在主线程回调.subscribe(pageList -> {//成功回调}, (OnError) error -> {//失败回调});注:这里设置的总超时时间要小于全局读、写、连接超时时间之和,否则无效
3.10、设置Converter3.10.1、设置全局Converter
IConverter converter = FastJsonConverter.create();RxHttp.setConverter(converter)3.10.2、为请求设置单独的Converter
首先需要在任意public类中通过@Converter注解声明Converter,如下:
public class RxHttpManager {@Converter(name = "XmlConverter") //指定Converter名称public static IConverter xmlConverter = XmlConverter.create();}然后,rebuild 一下项目,就在自动在RxHttp类中生成setXmlConverter()方法,随后就可以调用此方法为单个请求指定Converter,如下:
RxHttp.get("/service/...").setXmlConverter()//指定使用XmlConverter,不指定,则使用全局的Converter.asObject(NewsDataXml.class).as(RxLife.asOnMain(this))//感知生命周期,并在主线程回调.subscribe(dataXml -> {//成功回调}, (OnError) error -> {//失败回调});3.11、请求加解密3.11.1、加密
请求加密,需要自定义Param,非常简单,详情请查看本文5.2章节----自定义Param
3.11.2、解密
有些时候,请求会返回一大串的密文,此时就需要将密文转化为明文,直接来看代码,如下:
//设置数据解密/解码器RxHttp.setResultDecoder(new Function<String, String>() {//每次请求成功,都会回调这里,并传入请求返回的密文@Overridepublic String apply(String s) throws Exception {String plaintext = decode(s);//将密文解密成明文,解密逻辑自己实现return plaintext;//返回明文}});很简单,通过RxHttp.setResultDecoder(Function<String, String>)静态方法,传入一个接口对象,此接口会在每次请求成功的时候被回调,并传入请求返回的密文,只需要将密文解密后返回即可 。
然而,有些请求是不需求解密的,此时就可以调用setDecoderEnabled(boolean)方法,并传入false即可,如下:
RxHttp.get("/service/...").setDecoderEnabled(false)//设置本次请求不需要解密,默认为true.asString().subscribe(pageList -> {//成功回调}, (OnError) error -> {//失败回调});3.12、指定请求/回调线程RxHttp默认在Io线程执行请求,也默认在Io线程回调,即默认在同一Io线程执行请求并回调,当然,我们也可以指定请求/回调所在线程 。
3.12.1、指定请求所在线程
我们可以调用一些列subscribeXxx方法指定请求所在线程,如下:
//指定请求所在线程,需要在第二部曲前任意位置调用,第二部曲后调用无效RxHttp.get("/service/...").subscribeOnCurrent() //指定在当前线程执行请求,即同步执行,.asString().subscribe();//其它subscribeXxx方法subscribeOnIo()//RxHttp默认的请求线程subscribeOnSingle()subscribeOnNewThread()subscribeOnComputation()subscribeOnTrampoline()subscribeOn(Scheduler) //自定义请求线程


推荐阅读