可怕!RxHttp2

前两个参数相信大家一看就能明白,这里对第3个参数额外说一下,通过第三个参数,我们可以拿到Throwable异常对象,我们可以对异常做判断,如果需要重试,就返回true,不需要就返回false,下面看看具体代码

val student = RxHttp.postForm(“/service/…”)

.toClass()

.retry(2, 1000) { //重试2次,每次间隔1s

it is ConnectException //如果是网络异常就重试

}

.await()

3.2、timeout 超时


OkHttp提供了全局的读、写及连接超时,有时我们也需要为某个请求设置不同的超时时长,此时就可以用到RxHttp的timeout(Long)方法,如下:

val student = RxHttp.postForm(“/service/…”)

.toClass()

.timeout(3000) //超时时长为3s

.await()

3.3、async 异步操作符


如果我们由两个请求需要并行时,就可以使用该操作符,如下:

//同时获取两个学生信息

suspend void initData() {

val asyncStudent1 = RxHttp.postForm(“/service/…”)

.toClass()

.async() //这里会返回Deferred

val asyncStudent2 = RxHttp.postForm(“/service/…”)

.toClass()

.async() //这里会返回Deferred

//随后调用await方法获取对象

val student1 = asyncStudent1.await()

val student2 = asyncStudent2.await()

}

3.4、delay、startDelay 延迟


delay操作符是请求结束后,延迟一段时间返回;而startDelay操作符则是延迟一段时间后再发送请求,如下:

val student = RxHttp.postForm(“/service/…”)

.toClass()

.delay(1000) //请求回来后,延迟1s返回

.await()

val student = RxHttp.postForm(“/service/…”)

.toClass()

.startDelay(1000) //延迟1s后再发送请求

.await()

3.5、onErrorReturn、onErrorReturnItem异常默认值


有些情况,我们不希望请求出现异常时,直接走异常回调,此时我们就可以通过两个操作符,给出默认的值,如下:

//根据异常给出默认值

val student = RxHttp.postForm(“/service/…”)

.toClass()

.timeout(100) //超时时长为100毫秒

.onErrorReturn {

//如果时超时异常,就给出默认值,否则,抛出原异常

return@onErrorReturn if (it is TimeoutCancellationException)

Student()

else

throw it

}

.await()

//只要出现异常,就返回默认值

val student = RxHttp.postForm(“/service/…”)

.toClass()

.timeout(100) //超时时长为100毫秒

.onErrorReturnItem(Student())

.await()

3.6、tryAwait 异常返回null


如果你不想在异常时返回默认值,又不想异常是影响程序的执行,tryAwait就派上用场了,它会在异常出现时,返回null,如下:

val student = RxHttp.postForm(“/service/…”)

.toClass()

.timeout(100) //超时时长为100毫秒

.tryAwait() //这里返回 Student? 对象,即有可能为空

3.7、map 转换符号


map操作符很好理解,RxJava即协程的Flow都有该操作符,功能都是一样,用于转换对象,如下:

val student = RxHttp.postForm(“/service/…”)

.toStr()

.map { it.length } //String转Int

.tryAwait() //这里返回 Student? 对象,即有可能为空

3.8、以上操作符随意搭配


以上操作符,可随意搭配使用,但调用顺序的不同,产生的效果也不一样,这里悄悄告诉大家,以上操作符只会对上游代码产生影响。

timeout及retry

val student = RxHttp.postForm(“/service/…”)

.toClass()

.timeout(50)

.retry(2, 1000) { it is TimeoutCancellationException }

.await()

以上代码,只要出现超时,就会重试,并且最多重试两次。

但如果timeoutretry互换下位置,就不一样了,如下:

val student = RxHttp.postForm(“/service/…”)

.toClass()

.retry(2, 1000) { it is TimeoutCancellationException }

.timeout(50)

.await()

此时,如果50毫秒内请求没有完成,就会触发超时异常,并且直接走异常回调,不会重试。为什么会这样?原因很简单,timeout及retry操作符,仅对上游代码生效。如retry操作符,下游的异常是捕获不到的,这就是为什么timeout在retry下,超时时,重试机制没有触发的原因。

在看timeoutstartDelay操作符

val student = RxHttp.postForm(“/service/…”)

.toClass()

.startDelay(2000)

.timeout(1000)

.await()

以上代码,必定会触发超时异常,因为startDelay,延迟了2000毫秒,而超时时长只有1000毫秒,所以必定触发超时。 但互换下位置,又不一样了,如下:

val student = RxHttp.postForm(“/service/…”)

.toClass()

.timeout(1000)

.startDelay(2000)

.await()

以上代码正常情况下,都能正确拿到返回值,为什么?原因很简单,上面说过,操作符只会对上游产生影响,下游的startDelay延迟,它是不管的,也管不到。

4、协程开启/关闭/异常处理

=========================================================================

在以上示例中,我们统一用到await/tryAwait操作符获取请求返回值,它们都是suspend挂起函数,需要在另一个suspend挂起函数或者协程中才能被调用,故我们提供了RxLifeScope库来处理协程开启、关闭及异常处理,用法如下:

在FragemntActivity/Fragment/ViewModel环境下

在该环境下,直接调用rxLifeScope对象的lanuch方法开启协程即可,如下:

rxLifeScope.lanuch({

//协程代码块,运行在UI线程

val student = RxHttp.postForm(“/service/…”)

.toClass()

.await()

//可直接更新UI

}, {

//异常回调,这里可以拿到Throwable对象

})

以上代码,会在页面销毁时,自动关闭协程,同时自动关闭请求,无需担心内存泄露问题

非FragemntActivity/Fragment/ViewModel环境下

该环境下,我们需要手动创建RxLifeScope对象,随后调用lanuch方法开启协程

val job = RxLifeScope().lanuch({

//协程代码块,运行在UI线程

val student = RxHttp.postForm(“/service/…”)

.toClass()

.await()

//可直接更新UI

}, {

//异常回调,这里可以拿到Throwable对象

})

//在合适的时机关闭协程

job.cancel()

以上代码,由于未与生命周期绑定,故我们需要在合适的时机,手动关闭协程,协程关闭,请求也会跟着关闭

监听协程开启/结束回调

以上我们在lanuch方法,传入协程运行回调及异常回调,我们也可以传入协程开启及结束回调,如下:

rxLifeScope.launch({

//协程代码块

val student = RxHttp.postForm(“/service/…”)

.toClass()

.await()

//可直接更新UI

}, {

//异常回调,这里可以拿到Throwable对象,运行在UI线程

}, {

//开始回调,可以开启等待弹窗,运行在UI线程

}, {

//结束回调,可以销毁等待弹窗,运行在UI线程

})

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

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)**

最后

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-5HMLjHON-1713531949737)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值