RxJava介绍2:基本结构和使用场景,android系统工程师面试宝典

.subscribe { println(“in next 😒{Thread.currentThread()} $it”) }

//运行结果
in main:Thread[main,5,main]
in create:Thread[RxNewThreadScheduler-1,5,main]
in next :Thread[RxNewThreadScheduler-1,5,main] 5

image.png

observeOn

指定观察者所在线程。
我们先看一段代码运行结果。

println(“in main:KaTeX parse error: Expected '}', got 'EOF' at end of input: …tln("in create:{Thread.currentThread()}”);
it.onNext(1) }
//.observeOn(Schedulers.newThread())
.subscribe { println(“int next 😒{Thread.currentThread()} $it”) }

//运行结果
in main:Thread[main,5,main]
in create:Thread[main,5,main]
in next :Thread[main,5,main] 5

加上observeOn之后,发现observeOn下游运行线程都发生了变化。

println(“in main:KaTeX parse error: Expected '}', got 'EOF' at end of input: …tln("in create:{Thread.currentThread()}”);
it.onNext(1) }
.observeOn(Schedulers.newThread())
.subscribe { println(“in next 😒{Thread.currentThread()} $it”) }
//运行结果
in main:Thread[main,5,main]
in create:Thread[main,5,main]
in next :Thread[RxNewThreadScheduler-1,5,main] 5

image.png
特别的是:
image.png

Observer 观察者

APP中使用场景

列举目前我们App中使用到RxJava的场景。

网络请求:Retrofit+RxJava

@POST(“/content/user/info”)
Observable<BaseResponse> userInfo_Ob(@Body UserInfoReq req);

这里有一段我们使用操作符的代码,app初始化时同步服务端数据

//app初始化时同步服务端数据,
fun checkRequiredObservable(): Observable {
//后续需要的个人信息
var personRequiredInfo = PersonRequiredInfo()
val allObservables = arrayListOf(

//一系列独立的请求
appTabSetting(),//底部tab配置
userInfoObservable(),//用户信息
queryBindConfig(),//用户绑定账号信息
syncBabyInfoObservable(userId) //同步宝宝信息

)
var zipObservable = Observable.zip(allObservables) {
return@zip personRequiredInfo
}
return apolloAppConfig()//先获取apollo配置信息,同时保存配置
.flatMap {zipObservable } //并行上面一系列请求
.onErrorReturn { personRequiredInfo }
.doOnNext {registerUserSuperProperties()}
.compose(RxHelper.io2MainThread())
}
private fun syncBabyInfoObservable(): Observable {
return getBabyInfoObservable() //先获取服务端宝宝信息
.flatMap { updateBabyInfoObservable() } //本地与服务端比较,如果需要上传则上传
.flatMap { getBabyInfoObservable().map { Any() } }//再次获取同步后的宝宝信息
.onErrorReturn { Any()}
}

现有接口状况的情况下,很难想象,如果没有RxJava我该如何组合这些请求。

截屏2021-05-10 下午4.27.31.png

防抖(debounce)与节流(throttle)

debounce

Returns an Observable that mirrors the source ObservableSource, except that it drops items emitted by the source ObservableSource that are followed by newer items before a timeout value expires. The timer resets on each emission.

throttleFirst

Returns an Observable that emits only the first item emitted by the source ObservableSource during sequential time windows of a specified duration.

View重复点击

RxView.clicks(container)
.throttleFirst(800,TimeUnit.MILLISECONDS)
.subscribe { onclick() }

搜索防抖

RxTextView.textChanges(etSearch)
.debounce(searchDebounceTime, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe { goSearch(chars) }

页面刷新频率控制

class RefreshDebounce {
private var rxEmitter: ObservableEmitter? = null
private var observable = Observable
.create { rxEmitter = it }
.debounce(1000L, TimeUnit.MILLISECONDS)

constructor(consumer: (Long) -> Unit? ){
observable.subscribe { consumer.invoke(it) }
}
fun callRefresh() = rxEmitter?.onNext(System.currentTimeMillis())
}

//使用
var refreshDebounce = RefreshDebounce { println(“refresh:$it”) }
refreshDebounce.callRefresh()

定时/延时执行

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

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

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

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

.(img-o6glh44k-1710928667951)]

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

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值