关于Rxjava的文章国内已经不少了 比如扔物线的 给 Android 开发者的 RxJava 详解 还有一波操作符详解 RxJava 和 RxAndroid 二(操作符的使用) - 赵彦军 - 博客园
下午的时候捣腾了一下 这里写下自己的见解,rxjava 官网的介绍 自己简单的总结一下,就是处理异步的,比线程 handler asynctask 使用简单 使代码逻辑变得简单,重要的是随着业务越来越复杂的时候他还是能保持简洁。
Observable:被观察者
Observer: 被观察者 一般使用Subscriber这个抽象实现类
Call :事件
上例子:
//创建 被观察者
Observable.create(newObservable.OnSubscribe() {
@Override
public voidcall(Subscriber subscriber) {
subscriber.onNext("hello word!"); // 发送事件
subscriber.onCompleted(); //完成
}
}).subscribe(new Subscriber() { //订阅观察者
@Override
public void onCompleted() {
Log.e(TAG,"onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e(TAG,e.getMessage());
}
@Override
public void onNext(String s) { //事件
Log.e(TAG,s);
}
});
这是一个基本的例子,可以看到在rxjava中是被观察者订阅观察者 而不是观察者订阅被观察者 从而实现链式调用。 是的 这看起来并没有什么卵用...
说说在项目实际的使用吧,上家公司有个这样的需求,一个listview 的数据 来自于2个接口,按照套路来讲的话 写2个请求 第一个接口请求成功的回调方法 再去请求第二个接口,嗯 大概就是这样 代码可想而知如何写到 各种回调嵌套,下面用rxjava 来 演示下这样的需求
final List> listList =newArrayList<>();
Observable> observable1 = Observable.create(newObservable.OnSubscribe>() {
@Override
public void call(Subscriber> subscriber) {
List list =newArrayList<>();
for(inti =0;i <5;i++) {
list.add("this is observable1 merge :"+ i);
}
subscriber.onNext(list);
subscriber.onNext(list);
subscriber.onCompleted();
}
});
Observable> observable2 = Observable.create(new Observable.OnSubscribe>() {
@Override
public void call(Subscriber> subscriber) {
List list =new ArrayList<>();
for(inti =0;i <5;i++) {
list.add("this is observable2 merge :"+ i);
}
subscriber.onNext(list);
subscriber.onNext(list);
subscriber.onCompleted();
}
});
Observable.merge(observable1,observable2).subscribe(newSubscriber>() {
@Override
public void onCompleted() {
l(" onCompleted"+listList.toString());
}
@Override
public void onError(Throwable e) {
l(e.getMessage());
}
@Override
public void onNext(List strings) {
listList.add(strings);
}
});
好了 代码就差不多是这样,可以看到 我写了2个被观察者 call代码在项目中 换成请求接口代码 建议使用retrofit,retrofit已支持rxjava ,在这里我使用merge这个方法 将2个 请求的数据 合并成一个 或者zip 是的 用rxjava 就是这么 简单。
好了 再来看个 我想大家都有这样的业务逻辑 请求接口需要依赖另外一个接口的数据 在rxjava中是这么写的
Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber subscriber) {
subscriber.onNext("load data");
}
}).flatMap(newFunc1>() {
@Override
public Observablecall(String s) {
return Observable.create(newObservable.OnSubscribe() {
@Override
public voidcall(Subscriber subscriber) {
subscriber.onNext("load data2");
}
});
}
}).subscribe(new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
});
首先创建一个被观察者 在call方法里请求网络 数据回来之后 发送事件onNext() 在这里我使用了一个flatMap 的东西 这个东西是什么呢?字面意思是平铺是吧? 是吧 他就是做数据处理的 返回一个 Observable 继续做下一步操作 在事件触发之前 我把数据 换成了字符串类型,所以在观察者收到 的数据是字符串,rxjava中 可以随意的转换数据,更多操作符文头有链接 这里不多提,
还有一个重要的概念就是 线程切换
subscribeOn(Schedulers.io()) //被观察者处于什么线程
observeOn(AndroidSchedulers.mainThread()) // 观察者收到事件处于什么的线程
嗯先写到这... 未完。