.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
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
Observer 观察者
APP中使用场景
网络请求: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我该如何组合这些请求。
防抖(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移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
.(img-o6glh44k-1710928667951)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-vNU68cZD-1710928667951)]