参考:https://www.jianshu.com/p/5225b2baaecd
为什么要进行RxJava线程控制(调度 / 切换)?
在 RxJava模型中,被观察者 (Observable) / 观察者(Observer)的工作线程 = 创建自身的线程
即,若被观察者 (Observable) / 观察者(Observer)在主线程被创建,那么他们的工作(生产事件 / 接收& 响应事件)就会发生在主线程
因为创建被观察者 (Observable) / 观察者(Observer)的线程 = 主线程
所以生产事件 / 接收& 响应事件都发生在主线程
对于一般的需求场景,需要在子线程中实现耗时的操作;然后回到主线程实现 UI操作。
应用到 RxJava模型中,可理解为:
- 被观察者 (Observable) 在 子线程 中生产事件(如实现耗时操作等等)
- 观察者(Observer)在 主线程 接收 & 响应事件(即实现UI操作)
为了解决上述冲突,即实现 真正的异步操作,我们需要对RxJava进行 线程控制(也称为调度 / 切换)
private void fuc1() {
Observable.just("head.png", "icon.png")
.map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String s) throws Exception {
//网络获取
Log.i(TAG, "apply:----------->1 " + Thread.currentThread().getName());
return Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
}
})
.subscribe(new Consumer<Bitmap>() {
@Override
public void accept(Bitmap bitmap) throws Exception {
// 子线程
Log.i(TAG, "apply:----------->2 " + Thread.currentThread().getName());
// imageView.setIamgeView(bitmap)
}
});
输出:
hongxue: apply:----------->1 main
hongxue: apply:----------->2 main
hongxue: apply:----------->1 main
hongxue: apply:----------->2 main
我们知道需要在子线程中实现耗时的操作,然后回到主线程实现 UI操作。
线程类型:
在 RxJava中,内置了多种用于调度的线程类型
类型 | 含义 | 应用场景 |
---|---|---|
Schedulers.immediate() | 当前线程 = 不指定线程 | 默认 |
AndroidSchedulers.mainThread() | Android主线程 | 操作UI |
Schedulers.newThread() | 常规新线程 | 耗时等操作 |
Schedulers.io() | io操作线程 | 网络请求、读写文件等io密集型操作 |
Schedulers.computation() | CPU计算操作线程 | 大量计算操作 |
修改代码:
//被观察者 (Observable) 在 子线程 中生产事件(如实现耗时操作等等)
//观察者(Observer)在 主线程 接收 & 响应事件(即实现UI操作)
private void fuc1() {
// url -----> Bitmap
Observable.just("head.png", "icon.png")
.map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String s) throws Exception {
//网络获取
Log.i(TAG, "apply:----------->1 " + Thread.currentThread().getName());
return Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
// .subscribeOn(Schedulers.newThread())
.subscribe(new Consumer<Bitmap>() {
@Override
public void accept(Bitmap bitmap) throws Exception {
// 子线程
Log.i(TAG, "apply:----------->2 " + Thread.currentThread().getName());
// imageView.setIamgeView(bitmap)
}
});
}
输出结果:
hongxue: apply:----------->1 RxCachedThreadScheduler-1
hongxue: apply:----------->1 RxCachedThreadScheduler-1
hongxue: apply:----------->2 main
hongxue: apply:----------->2 main