RxHttp-一条链发送请求,新一代Http请求神器(一,3个月学会Android开发

本文介绍了RxHttp库在Android开发中的使用,包括设置公共参数、不同请求方式的处理、文件上传下载以及生命周期管理,确保请求在Activity/Fragment销毁时自动关闭。作者还提到了如何利用注解处理器生成自定义的请求方式和提供的学习资源链接。
摘要由CSDN通过智能技术生成

此步骤是非必须的,不初始化或者传入null即代表使用默认OkHttpClient对象。

疑问:标题不是说好的是RxHttp,这么用HttpSender做一些初始化呢?这里先卖一个关子,后面会解答

设置公共参数

相信大多数开发者在开发中,都遇到要为Http请求添加公共参数/请求头,甚至要为不同类型的请求添加不同的公共参数/请求头,为此,RxHttp为大家提供了一个静态接口回调,如下,每发起一次请求,此接口就会被回调一次,并且此回调在子线程进行(在请求执行线程回调)

HttpSender.setOnParamAssembly(new Function() {
@Override
public Param apply(Param p) {
if (p instanceof GetRequest) {//根据不同请求添加不同参数
} else if (p instanceof PostRequest) {
} else if (p instanceof PutRequest) {
} else if (p instanceof DeleteRequest) {
}
//可以通过 p.getSimpleUrl() 拿到url更改后,重新设置
//p.setUrl(“”);
return p.add(“versionName”, “1.0.0”)//添加公共参数
.addHeader(“deviceType”, “android”); //添加公共请求头
}
});

然后有些请求我们不希望添加公共参数/请求头,RxHttp又改如何实现呢?很简单,发起请求前,设置不添加公共参数,如下:

Param param = Param.get(“http://…”)
//设置是否对Param对象修饰,即是否添加公共参数,默认为true
.setAssemblyEnabled(false); //设为false,就不会回调上面的静态接口

到这,也许你们会有疑问,Param 是什么东东,下面就为大家讲解。

Param

首先,我们来看看如何发送一个请求

Param param = Param.get(“http://…”)
.add(“key”, “value”);
Disposable disposable = HttpSender.from(param)
.subscribe(s -> { //这里的s为String类型,即Http请求的返回结果
//成功回调
}, throwable -> {
//失败回调
});

疑问:说好的一条链发送请求呢?别着急,还没到放大招的时候 到这,我可以告诉大家,Param承担的是一个请求体的一个角色,我们通过Param可以确定请求方式(如:Get、Post、Put、Delete等请求方式)、添加请求参数、添加请求头、添加File对象等;然后通过HttpSender,传入Param对象,将请求发送出去。

HttpSender

到这,有人又有疑问,前面初始化、设置公共参数都用到了HttpSender,这里发送请求又用到了HttpSender ,那么它又是承担怎么样的一个角色呢?看名字,我们可以理解为它就是一个请求发送者,通过一个from操作符,传入一个Param对象,然后返回一个RxJavaObservable对象,此时,我们就可以使用RxJava强大的操作符去处理相关的逻辑(这就是简介说的,做到了与RxJava的无缝链接),在这,我们只是使用了subscribe操作符去订阅观察者。

RxHttp

现在,我们正式放大招,标题说好的一条链发送请求,既然吹牛了,就要去实现它。拿上面的例子,看看我们如何一条链实现,上代码

RxHttp.get(“http://…”)
.add(“key”, “value”)
.from()
.subscribe(s -> { //这里的s为String类型,即Http请求的返回结果
//成功回调
}, throwable -> {
//失败回调
});

我们的主角RxHttp终于登场了,可以看到使用RxHttp类我们就实现了一条链完成请求的发送,那它又是承担一个什么角色呢?我们暂时可以理解为RxHttp=Param+HttpSender,并且还有自己特殊的使命。至于什么使用,后面会讲解。

我们现在来解疑惑,为什么我们的库叫RxHttp,但是初始化、设置公共参数等却用HttpSender?因为RxHttp这个类不在RxHttp库中,它是通过注解处理器生成的类。前面我们看到gradle依赖时,使用了

annotationProcessor ‘com.rxjava.rxhttp:rxhttp-compiler:1.0.1’

该注解处理器的目的就是在项目中生成RxHttp类,那为何不直接把它写到库里面去呢?前面讲过,因为它有自己的使命,而这个使命,在RxHttp库里无法完成。

接下来,我们来看看,如何发送Post请求、如何在Activity/Fragment销毁时,自动关闭为完成的请求、如何上传/下载文件及进度的监听、如何把Http返回的结果自动解析成我们想要的对象。

注:以下讲解均使用RxHttp

Post

RxHttp.postForm(“http://…”)
.add(“key”, “value”)
.from()
.subscribe(s -> { //这里的s为String类型,即Http请求的返回结果
//成功回调
}, throwable -> {
//失败回调
});

可以看到,跟上面的Get请求只有一点不同,Get是RxHttp.get,而Post是RxHttp.postForm,除此之外,没有任何区别,我们在看来来,RxHttp都有哪些静态方法供我们选择请求方式

可以看到,默认提供了10个静态方法供我们选择具体的请求方式,有Get、Post、Put等,而Post等又分为postForm和postJson,这个好理解,前者是发送表单形式的post请求,后者是发送json字符串的post请求。

现实中,这些默认的请求方式显然不能满足我们的需求,如:我要发送加密的post请求,这个时候该怎么办呢?此时就需要我们自定义请求方式。

Activity 销毁,自动关闭未完成的请求

上面的案例中,在Activity/Fragment销毁时,如果请求还未完成,就会造成Activity/Fragment 无法回收,导致内存泄漏。这是非常严重的问题,那么RxHttp是如何解决的呢?此时,就要引入我自己写的另一个库RxLife,直接看看如何使用

RxHttp.postForm(“http://…”)
.add(“key”, “value”)
.from()
.as(RxLife.as(this)) //订阅观察者前,加上这句话即可
.subscribe(s -> {
//成功回调
}, throwable -> {
//失败回调
});
//或者
RxHttp.postForm(“http://…”)
.add(“key”, “value”)
.from()
.as(RxLife.asOnMain(this)) //asOnMain 可以在主线程回调观察者
.subscribe(s -> {
//成功回调
}, throwable -> {
//失败回调
});

这里的thisLifecycleOwner对象,它是一个接口,这里我们传入的是Activity,因为Activity实现了LifecycleOwner接口。当Activity/Fragment销毁时,会将RxJava的管道中断,管道中断时,又会将未完成的请求自动关闭。 在下面的讲解中,我们均会使用RxLife

文件上传/下载及进度监听

使用RxHttp,可以很优雅的实现文件上传/下载及进度的监听,如何优雅?直接上代码

文件上传

RxHttp.postForm(“http://…”) //发送Form表单形式的Post请求
.add(“key”, “value”)
.add(“file1”, new File(“xxx/1.png”)) //添加file对象
.add(“file2”, new File(“xxx/2.png”))
.from() //from操作符,是异步操作
.as(RxLife.asOnMain(this)) //感知生命周期,并在主线程回调
.subscribe(s -> {
//成功回调
}, throwable -> {
//失败回调
});

可以看到,文件上传跟普通的post请求其实没啥区别,无非就是在post请求的基础上,调用add方法添加要上传的文件对象。

文件下载

//文件存储路径
String destPath = getExternalCacheDir() + “/” + System.currentTimeMillis() + “.apk”;
RxHttp.get(“http://update.9158.com/miaolive/Miaolive.apk”)
.download(destPath) //注意这里使用download操作符,并传入本地路径
.as(RxLife.asOnMain(this)) //感知生命周期,并在主线程回调
.subscribe(s -> {
//下载成功,回调文件下载路径
}, throwable -> {
//下载失败
});

下载跟普通请求不同的是,下载使用的是download操作符,其它都一样。

文件下载进度监听

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

小福利:

在当下这个碎片化信息环境的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021大厂最新Android面试真题解析

Android大厂面试真题解析

各个模块学习视频:如数据结构与算法

算法与数据结构资料图

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
一线互联网架构师

这份体系学习笔记,适应人群:**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!点赞+评论即可获得!

直接点击这里前往我的GitHub中下载,就可以白嫖啦,记得给文章点个赞哦。

路线与进阶方向。**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!点赞+评论即可获得!

直接点击这里前往我的GitHub中下载,就可以白嫖啦,记得给文章点个赞哦。

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值