各位看官们大家好,上一回中咱们说的例子是"RxJava中的多线程操作",本章回中介绍的例子是"R xJava中的线程切换"。闲话休提,言归正转,让我们一起Talk Android吧!
概念介绍
我们在上一章回中介绍了如何创建多线程,本章回将介绍如何进行线程切换。线程切换是指在主线程和子线程之间进行切换,因为Android只能在主线程中更新UI,所以通过线程切换来更新UI。切换切换也可以通过Andoird的Handler机制实现,我们之前介绍过,这里就不展开讨论了。
使用方法
线程切换也是使用subscribeOn
或者observeOn
操作符,切换线程时使用不同的参数:
- 切换到子线程时使用的参数为Schedulers.newThread()
- 切换到主线程时使用的参数为AndroidSchedulers.mainThread()。
示例代码
Log.d(TAG, "rxJavaEx: "+Thread.currentThread());
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@io.reactivex.rxjava3.annotations.NonNull ObservableEmitter<String> emitter) throws Throwable {
Log.d(TAG, "subscribe: "+Thread.currentThread());
emitter.onNext("Event 1");
emitter.onNext("Event 2");
emitter.onComplete();
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Throwable {
Log.d(TAG, " Observer accept: "+s+" "+Thread.currentThread());
}
});
注意:上面程序中使用的AndroidSchedulers
类来自rxjava包,而不是rxandroid包,在文件头import包时需要区分这两种包,否则使用rxAndroid包中的类时程序会报编译错误。我的项目在gradle中导入了rxAndroid依赖,因此会有rxJava和rxAndroid两种类型的包,大家的项目可能不会有这种情况。
上面的代码中我们先是把被观察者切换到了子线程运行,然后把观察者切换到主线程运行。编译并且运行该程序,通过结果来检验是否可以在子线程和主线程之间切换。
: rxJavaEx: Thread[main,5,main]
: subscribe: Thread[RxNewThreadScheduler-1,5,main]
: Observer accept: Event 1 Thread[main,5,main]
: Observer accept: Event 2 Thread[main,5,main]
从程序的运行结果中可以看到所有的程序运行在主线程main中,被观察者运行在子线程RxNewThreadScheduler-1
中,观察者运行在主线程main中。该结果与我们刚才分析的程序逻辑完全一致,表明上面的程序可以实现线程切换功能。
看官们,关于"RxJava中的线程切换"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!