开发中使用io.reactivex遇到
log:
java.lang.NoClassDefFoundError: io.reactivex.Flowable
代码:
val observable = Observable.defer(object : Callable<ObservableSource<TeslaResponseWithJson>> {
override fun call(): ObservableSource<TeslaResponseWithJson> {
//访问网络返回数据
return Observable.just(SecurityManager.getInstance(context).doEncryptPost(PUBLIC_URL, TransId_GPSNumQuery, params))
}
})
.subscribeOn(Schedulers.io())//io线程执行
.observeOn(AndroidSchedulers.mainThread()) // 返回值在UI线程执行
.observeOn(AndroidSchedulers.mainThread()) 始终在报错
解决方案
val observable = Observable.defer(object : Callable<ObservableSource<TeslaResponseWithJson>> {
override fun call(): ObservableSource<TeslaResponseWithJson> {
//访问网络返回数据
return Observable.just(SecurityManager.getInstance(context).doEncryptPost(PUBLIC_URL, TransId_GPSNumQuery, params))
}
})
.subscribeOn(Schedulers.io())//io线程执行
.observeOn(AndroidSchedulers.mainThread(), false, 100) // 返回值在UI线程执行
原因分析
observeOn方法:
可以导入一个或两个或三个参数,且导入一个和两个参数的方法有个with Flowable
字样,表示需要使用Flowable,导入三个参数的方法没有其字样,然后我用第三种方法observeOn(AndroidSchedulers.mainThread(),false,120)
,运行成功。
“island size”
这三个方法都提及到了”island size”,中文字面翻译“岛屿大小”,比较抽象,我把它叫做背压堆积大小。
rxJava 2.x中只有两个观察者:
- 一个是Observable
- 一个是Flowable
它合并了rxJava 1.x的Subscriber,并多了一个onSubscribe
方法(即原来Subscriber的onStart方法),用来进行订阅的初始化操作。
Flowable
自动背压堆积并支持匹配背压堆积大小”island size”,Observable并不会,所以在Observable订阅时要多加入一个int值,用与指定背压堆积大小。
所以,背压概念是rxJava 2.x中无时无刻都要注意的地方。