retry(2, 1000) { it is ConnectException } //有条件、间隔1s、重试2次
retry(period = 1000) { it is ConnectException } //有条件、间断1s、一直重试
前两个参数相信大家一看就能明白,这里对第3个参数额外说一下,通过第三个参数,我们可以拿到Throwable
异常对象,我们可以对异常做判断,如果需要重试,就返回true,不需要就返回false,下面看看具体代码
val student = RxHttp.postForm(“/service/…”)
.toClass()
.retry(2, 1000) { //重试2次,每次间隔1s
it is ConnectException //如果是网络异常就重试
}
.await()
OkHttp提供了全局的读、写及连接超时,有时我们也需要为某个请求设置不同的超时时长,此时就可以用到RxHttp的timeout(Long)
方法,如下:
val student = RxHttp.postForm(“/service/…”)
.toClass()
.timeout(3000) //超时时长为3s
.await()
如果我们由两个请求需要并行时,就可以使用该操作符,如下:
//同时获取两个学生信息
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()
}
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()
如果你不想在异常时返回默认值,又不想异常是影响程序的执行,tryAwait
就派上用场了,它会在异常出现时,返回null,如下:
val student = RxHttp.postForm(“/service/…”)
.toClass()
.timeout(100) //超时时长为100毫秒
.tryAwait() //这里返回 Student? 对象,即有可能为空
map
操作符很好理解,RxJava即协程的Flow都有该操作符,功能都是一样,用于转换对象,如下:
val student = RxHttp.postForm(“/service/…”)
.toStr()
.map { it.length } //String转Int
.tryAwait() //这里返回 Student? 对象,即有可能为空
以上操作符,可随意搭配使用,但调用顺序的不同,产生的效果也不一样,这里悄悄告诉大家,以上操作符只会对上游代码产生影响。
如timeout及retry
:
val student = RxHttp.postForm(“/service/…”)
.toClass()
.timeout(50)
.retry(2, 1000) { it is TimeoutCancellationException }
.await()
以上代码,只要出现超时,就会重试,并且最多重试两次。
但如果timeout
、retry
互换下位置,就不一样了,如下:
val student = RxHttp.postForm(“/service/…”)
.toClass()
.retry(2, 1000) { it is TimeoutCancellationException }
.timeout(50)
.await()
此时,如果50毫秒内请求没有完成,就会触发超时异常,并且直接走异常回调,不会重试。为什么会这样?原因很简单,timeout及retry
操作符,仅对上游代码生效。如retry操作符,下游的异常是捕获不到的,这就是为什么timeout在retry下,超时时,重试机制没有触发的原因。
在看timeout
和startDelay
操作符
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()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以加一下下面的技术群。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
这里放一下资料获取方式:GitHub
好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
大家。
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以加一下下面的技术群。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
这里放一下资料获取方式:GitHub
[外链图片转存中…(img-hmiE6Rwn-1710903289217)]
好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
[外链图片转存中…(img-0rUBJgEG-1710903289218)]
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!