rxjava
简单使用
其实rxjava入门并没有想象中的难,常用的简单方法就几个。我们来看一个最简单的例子
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onComplete();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
LogUtil.i("XJL", "1");
}
});
这个例子就是利用create创建出来一个被观察者,这个被观察者仅仅只是发送了个数字便结束了,我们需要注意的是,在我们创建出来这个被观察者时,如果没有明确指定一创建就执行的话,它并不会马上执行,只有在subcribe调用时,也就是有观察者进行订阅时才会执行。其中,subscribeOn用来指定被观察者的执行线程,它对前面的被观察者起作用。而observeOn方法用来指定观察者的执行线程,它对后面的subscribe方法起作用。subscribe用来设置我们的观察者,也就是我们对于被观察者发射的数据的处理方法。
当然我们也能够通过rxjava提供的更为便捷的创建方法创建Observable
Observable.just(1, 2, 3).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.i("XJL", "=====>" + integer );
}
});
这个just就是rxjava提供的遍历函数,它会将我们给定的参数按序发送给下游,类似这样的函数还有很多,这个就是rxjava的简单使用。
rxjava结合retrofit的使用
retrofit作为现在android开发者的利器,当然也和rxjava能够互通有无。下面我们来看看retrofit如何结合rxjava来使用。
retrofit配置
首先我们需要在项目中的build.gradle中引入rxjava依赖,和jakewharton提供的rxjava2和retrofit完美结合的插件。因为retrofit现在还没有完全兼容刚升级不久的rxjava2。
...
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'android.arch.persistence.room:rxjava2:1.0.0'
...
然后我们需要在构造retrofit实体的时候,添加rxjavaAdapter
return new Retrofit.Builder()
.baseUrl(baseUrl)
.client(createOkHttpClient())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(createGsonConverter()))
.build();
这个RxJava2CallAdapterFactory就是com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0这个依赖库中所提供的插件。这样,我们最基础的配置就完成了。
对于我们的Interface,最初的使用是返回的OkHttp所需的Call,现在引入了rxjava2,我们可以将返回类型替换为Observable,对于这个Observable的生成是在网络返回时,在adapterFactory通过我们前面配置的rxjavaAdapter来进行转化。
//原始的retrofit请求
@GET("commonUrl")
Call<T> getT();
//Rxjava的retrofit请求
@GET("commonUrl")
Obserable<T> getT();
然后在最外层的调用可以直接通过获取到这个Obserable进行相应的处理.
Client.getT().subscribeOn(Schedulers.io())..observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<T>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(T o) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
其中onSubscribe回调是在我们执行了subscribe方法之后的回调,onNext是成功返回的回调,onError是网络错误的回调,onComplete是整个流程结束后的返回。
rxjava订阅流程解析
Observable.create方法
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
//将会返回一个ObservableCreate,封装了原始的Observable,
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
这个create方法接收一个ObservableOnSubscribe参数,这个ObservableOnSubscribe提供了我们需要的常规操作。
public interface ObservableOnSubscribe<T> {
//通过subscribe的参数ObservableEmitter来发送消息
void subscribe(@NonNull ObservableEmitter<T> e) throws Exception;
}
ObservableOnSubscribe是一个接口,需要