RxJava 日常,今天填这个坑。
线程控制
对上下游的线程进行控制
平时写的代码都运行在主线程中,当我们使用RxJava的时候,像这样:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
Log.d("rxjava","thread :" +Thread.currentThread().getName());
e.onNext(1);
}
});
Consumer<Integer> consumer = new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
Log.d("rxjava","thread :" +Thread.currentThread().getName());
}
};
observable.subscribe(consumer);
}
输出结果两个都是main,所以在默认情况下上下是在同一个线程工作的。
想想,那可不行,这有很多业务都是需要在子线程执行耗时操作,主线程更新UI的,咋办呢?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
Log.d("rxjava","thread :" +Thread.currentThread().getName());
e.onNext(1);
}
});
Consumer<Integer> consumer = new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer integer) throws Exception {
Log.d("rxjava","thread :" +Thread.currentThread().getName());
}
};
observable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(consumer);
}
这样写的话就可以做到了,输出结果为RxNewThreadScheduler-2和main。
可以看到只是对subscribeOn(Schedulers.newThread()和observeOn(AndroidSchedulers.mainThread())进行了设置。这样上游就在子线程执行,下游会在主线程工作。
值得注意的是:这玩意不论你怎么来回调用,只会保留第一次你设置时候的属性。
内置线程,RxJava内置了一些线程供选项我们使用:
- Schedulers.io()
代表io操作的线程, 通常用于网络,读写文件等io密集型的操作 - Schedulers.computation()
代表CPU计算密集型的操作, 例如需要大量计算的操作 - Schedulers.newThread()
代表一个常规的新线程 - AndroidSchedulers.mainThread()
代表Android的主线程
有一个坑
当我们在执行流的过程中退出了这个Activity,当流回到主线程更新UI的时候傻眼了,都jier没了,于是程序就崩溃了。解决办法:调用Disposable的dispose()。当然如果有很多Disposable的情况下,可以使用CompositeDisposable容易,把Disposable这家伙add进去,然后在需要的时候调用CompositeDisposable.clear() 就可以了。
Over,谁都有几段故事。
没有?想想那个谁
网友评论