RxJava基本使用–线程切换
Observable.create(object : ObservableOnSubscribe<String>{
override fun subscribe(emitter: ObservableEmitter<String>) {
Log.e("RxJavaActivity","上游=当前线程为="+Thread.currentThread().name)
emitter.onNext("")
}
}).subscribe(object : Observer<String>{
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
Log.e("RxJavaActivity","onSubscribe=当前线程为="+Thread.currentThread().name)
}
override fun onNext(t: String) {
Log.e("RxJavaActivity","下游=当前线程为="+Thread.currentThread().name)
}
override fun onError(e: Throwable) {
}
})
默认情况下均为主线程。
Observable.create(object : ObservableOnSubscribe<String>{
override fun subscribe(emitter: ObservableEmitter<String>) {
Log.e("RxJavaActivity","上游=当前线程为="+Thread.currentThread().name)
emitter.onNext("")
}
}).subscribeOn(Schedulers.io()) //上游的线程
.observeOn(AndroidSchedulers.mainThread()) //下游的线程
.subscribe(object : Observer<String>{
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
Log.e("RxJavaActivity","onSubscribe=当前线程为="+Thread.currentThread().name)
}
override fun onNext(t: String) {
Log.e("RxJavaActivity","下游=当前线程为="+Thread.currentThread().name)
}
override fun onError(e: Throwable) {
}
})
经过线程切换后的线程情况。
Observable.create(object : ObservableOnSubscribe<String>{
override fun subscribe(emitter: ObservableEmitter<String>) {
Log.e("RxJavaActivity","上游=当前线程为="+Thread.currentThread().name)
emitter.onNext("")
}
}).subscribeOn(Schedulers.io()) //上游的线程
.subscribeOn(AndroidSchedulers.mainThread()) //上游的线程再次切换会被忽略,不生效
.observeOn(AndroidSchedulers.mainThread()) //下游的线程
.observeOn(Schedulers.io()) //下游的线程每切换一次生效一次
.subscribe(object : Observer<String>{
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
Log.e("RxJavaActivity","onSubscribe=当前线程为="+Thread.currentThread().name)
}
override fun onNext(t: String) {
Log.e("RxJavaActivity","下游=当前线程为="+Thread.currentThread().name)
}
override fun onError(e: Throwable) {
}
})
上游的线程再次切换会被忽略,不生效
下游的线程每切换一次生效一次
onSubscribe()方法中一直会是主线程,不会随着线程切换变化。
实例
//上游
Observable.just(path)
//转换
.map(object : Function<String,Bitmap>{
override fun apply(t: String): Bitmap? {
val url = URL(path)
var urlConnection = url.openConnection()
var httpConnection : HttpURLConnection = urlConnection as HttpURLConnection
httpConnection.connectTimeout = 5000
var responseCode = httpConnection.responseCode
if (responseCode == HttpURLConnection.HTTP_OK) {
var inputStream = httpConnection.inputStream
var bitmap = BitmapFactory.decodeStream(inputStream)
return bitmap
}
return null
}
})
//加水印
.map(object : Function<Bitmap,Bitmap>{
override fun apply(t: Bitmap): Bitmap {
return ImageUtils.drawTextToLeftTop(instance,t,"111111",30,Color.RED,10,10)
}
})
//线程切换
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
//下游
.subscribe(object : Observer<Bitmap>{
override fun onComplete() {
dismiss()
}
override fun onSubscribe(d: Disposable) {
progressDialog = ProgressDialog(instance)
progressDialog!!.setMessage("正在下载。。。")
progressDialog!!.show()
}
override fun onNext(t: Bitmap) {
iv_image.setImageBitmap(t)
}
override fun onError(e: Throwable) {
dismiss()
}
})
效果图: