在 Rxjava 中,如果把整个 事件流看成 是工厂的流水线,Observable 就是原料,Observer 就是我们的产品经理。产品如何交到我们的产品经理手上?其中重要的就是操作工人(Operator 操作符),它负责在 Observable 发出的事件 和 Observer 的响应之间做一些处理。
操作符分类
Creating ObservablesTransforming ObservablesFiltering ObservablesCombining Observables(合并)Error Handling OperatorsObservable Utility Operators(辅助类)Conditional and Boolean OperatorsMathematical and Aggregate Operators(算数)Connectable Observable Operators(背压)Operators to Convert Observables(连接)自定义操作符有了Observable和Obsever,我们就可以随便玩了,任取一个已创建的Observable和Observer关联上,即形成一个RxJava的例子
// 3.被观察者订阅观察者 observable // 建议在这修改数据 .map(new Func1<String, String>() { // 第一个参数决定 call方法类型,第二个参数决定返回值类型 @Override public String call(String arg0) { return arg0 + "汤圆"; } }) .subscribe(observer);observer
的onNext
方法将会依次收到来自observable
的数据”just1”、”just2”,另外,如果你不在意数据是否接收完或者是否出现错误,即不需要Observer
的onCompleted()
和onError()
方法,可使用Action1
,subscribe()
支持将Action1
作为参数传入,RxJava
将会调用它的call方法来接收数据,代码如下:
但是,领导突然又不想要所有用户了,只要名字叫“小明”的用户,行吧,领导最大,我改(假设名字唯一):
Observable.create(new Observable.OnSubscribe<List<User>>() { @Override public void call(Subscriber<? super List<User>> subscriber) { List<User> userList = null; ··· //从数据库获取用户表数据并赋给userList ··· subscriber.onNext(userList); } }).flatMap(new Func1<List<User>, Observable<User>>() { @Override public Observable<User> call(List<User> users) { return Observable.from(users); } }).filter(new Func1<User, Boolean>() { @Override public Boolean call(User user) { return user.getName().equals("小明"); } }).subscribe(new Action1<User>() { @Override public void call(User user) { //拿到谜之小明的数据 } });搞定,这时候领导又说,我不要小明了,我要小明的爸爸的数据,(坑爹啊~~),我继续改:
Observable.create(new Observable.OnSubscribe<List<User>>() { @Override public void call(Subscriber<? super List<User>> subscriber) { List<User> userList = null; ··· //从数据库获取用户表数据并赋给userList ··· subscriber.onNext(userList); } }).flatMap(new Func1<List<User>, Observable<User>>() { @Override public Observable<User> call(List<User> users) { return Observable.from(users); } }).filter(new Func1<User, Boolean>() { @Override public Boolean call(User user) { return user.getName().equals("小明"); } }).map(new Func1<User, User>() { @Override public User call(User user) { //根据小明的数据user从数据库查找出小明的父亲user2 return user2; } }).subscribe(new Action1<User>() { @Override public void call(User user2) { //拿到谜之小明的爸爸的数据 } });RxJava在需求不断变更、逻辑愈加复杂的情况下,依旧可以保持代码简洁、可阅读性强的一面,没有各种回调,也没有谜之缩进!
新闻热点
疑难解答