在开发当中只要不是静态页面,我们都要对后台服务器发起网络请求。
总所周知,发起网络请求是一个耗时操作,一般的耗时操作都必须开启一个子线程来进行请求,从网络端拿到数据之后我们要将数据set到各种UI控件中去。但是坑爹的是,在子线程之中我们并不能更新UI,必须在主线程(又称UI线程)进行数据的set,因此我们又必须切换到主线程去做处理。这样一会儿子线程,一会儿主线程的切换处理,非常让人头疼,代码往往是东一点西一点的写,后期不要说维护了,就是自己看都看不懂。但是有了RxJava这个神器,线程之间的切换变得异常的简单且看起来简便。
默认情况下,RxJava和Handler一样,保持着线程不变原则。在哪个线程实例化就跟哪个线程绑定,即如果在主线程实例化则跟主线程绑定,如果在子线程实例化则跟子线程绑定。如果需要进行线程之间的切换,那么就要使用调度器Scheduler。
schedule默认有以下几个线程切换方法:
-
schedule.immediate():直接在当前线程执行,相当于不指定线程。就是我们在上面所说的那个,在哪个线程实例化就和哪个线程绑定。这是默认的schedule。
-
schedule.newThread():直接开启一个新的线程。
- schedule.io(): 顾名思义,开启一个io线程,完成对网络请求和文件读写数据库增删改查等操作。可能这时候有人就要问了,那io和newThread有什么区别呐?其实区别在于,newThread不管有没有线程,他都会去重新开启一个新的线程来进行操作,并且没线程池维护。但是io的线程是无上限的,并且最大的一个好处是它会去重用空闲的线程,而不是每次都开启一个线程来使用,效率上比newThread要高。所以,一般我们在使用的时候是直接使用io这个方法。
android有一个专门的线程,AndroidSchedule.mainThread(),专门用来指定操作在主线程完成。
有了上面的几个线程操作的知识,我们就可以开始自由的对线程进行操作了。
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
//TODO 在此处进行网络请求的操作
}
}).subscribeOn(Schedulers.io()) //指定被观察者中的方法在io线程中进行处理
.observeOn(AndroidSchedulers.mainThread()) //指定观察者接收数据在主线程中
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
//TODO 在此处主线程中进行UI的更新
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
我们在对线程进行切换的时候依靠两个方法。
subscribeOn():这个方法指定了Observable被观察者在哪个线程执行。
observeOn():这个方法制定了观察者在哪个线程中执行。
拥有了这两个方法,再加上schedule操作线程,我们便可以把耗时的网络操作放在子线程中进行操作了,然后将获取到的json字符串直接通过onNext()方法发送给观察者observe,让他在主线程进行数据的更新操作。再加上RxJava是链式结构操作,我们代码看上去一目了然,再也不是东一下西一下的乱来了。
如果你觉得这就是RxJava全部内容,那你就太小看RxJava了。线程之间的切换只能说是他强大功能中的牛刀小试而已。他真正强大的是他无敌一般存在的各种操作符,拥有了这些操作符,你几乎可以干很多你之前需要大把代码并且写起来极其复杂的逻辑才能完成的功能了。并且依然遵循着他自身特点,操作简单、观看简洁的特点。后续将逐一来写RxJava的各种操作符,并写明操作符可以在哪些场景使用。