您的位置:首页 > 编程语言 > Java开发

我理解的RxJava

2016-05-09 20:27 549 查看

一.前言

1.lz身为一个程序员撸了大概俩年代码了把,同时身为大学生自己也做过几个项目,跟着老师也做了几个小项目,由JavaWeb学到Android再到linux入门,有时候接触多了真的觉得前期项目的结构超级超级重要,所以花了一段时间查找跟架构有关的资料,以前就听说过RxJava,可是没怎么关注,最近就开始研究,相关的参考资料:

架构相关:

知乎:Android项目开发如何设计整体架构?

https://www.zhihu.com/question/45517397

【译】Android应用架构

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1214/3772.html

RxJava相关资料:

当然是大头鬼的:

/article/2268010.html

还有大头鬼整理出来的RxJava相关的资料:

https://github.com/lzyzsd/Awesome-RxJava(强力推荐以第一篇来入门)

二.开始我的RxJava之旅

为什么用RxJava

看了上面我推荐的关于架构的文章,可能你已经知道我为什么会去关注RxJava了。通俗的讲,RxJava就是一种模式:高级观察者模式

何谓高级观察者模式呢,口头上讲就是:我等你,如果我等到你,我就让你嘿嘿嘿;作为一名程序员肯定用过setOnClickListener这些监听回调,但是有时候逻辑太复杂就会然后这些监听一层嵌套一层,这里我先举个例子:

eg:我要进入某个页面,在进入之前必须先判断当前是否登录,如果未登录,就弹出dialog,如果点击确定,就跳到登录页面,当登录完成后再跳到最开始想要进入的那个页面,如果点击了dialog的取消,就要弹出一个提示框,提示未登录无法进入

相信大家也可以想象得到如果上面这段逻辑用回调实现的时候,那个代码是有多恐怖,也就是Callback Hell(回调地狱).

那使用RxJava是怎么实现的呢?

RxJava可以让你代码实现流水线方式解决问题,虽然还是免不了嵌套,但是大大减少了嵌套的层数,让代码更加结构化和更加简洁

总结起来,RxJava的优点:

让整体项目更有结构性,每一层有每一层该做的事,减少层与层之间的耦合,通过一个数据驱动器来分发数据和管理数据

大量的减少ui层的代码量

优化多重嵌套

总之很多很多好处

三.Rx简单入门

1.概念

概念这东西其实很简单,从本质上去理解RxJava,其实也就是一个观察者A,一个被观察者B,然后每当A去观察B,B就会去调用某个方法,然后结果返回给A.

当然,这只是简单化的理解,在真实的应用中,A与B中间隔了很多个方法,这些方法包括类型的转换,异常的捕捉等等,这些后面会讲到

2.如何完成一个流程

创建一个被观察者myObservable,最简单地方式,就是直接调用create()

Observable<String> myObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> sub) {
//sub就是观察者,发送一个字符串
sub.onNext("Hello, world!");
sub.onCompleted();
}
}
);


然后创建一个被观察者Subscriber来处理Observable对象发出的字符串

Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onNext(String s) { System.out.println(s); }

@Override
public void onCompleted() { }

@Override
public void onError(Throwable e) { }
};


创建观察者Subscriber需要实现三个方法:

onNext(String s) 就是被观察者做完一件事会调用的

onCompleted() 当所有事件完成后调用

onError(Throwable e) 当被观察者发生异常的时候,可以通过return Observation.error(Exception),把异常返回给观察者由观察者来决定怎么处理

观察者与被观察者的绑定

myObservable.subscribe(mySubscriber);


一旦mySubscriber订阅了myObservable,myObservable就是调用mySubscriber对象的onNext和onComplete方法,mySubscriber就会打印出Hello World!

3.优化

当然上面只是最基本的创建观察者与被观察者之间联系的最简单方式,作为一个成熟的框架,然后有更简单地方法去实现这俩者之间的关系

创建一个被观察者:

Observable<String> myObservable = Observable.just("Hello, world!");


可能初学者看到just()函数会比较萌萌哒,我的理解方式就是创建一个被观察者,只发出一个事件,其他的我不管,然后接下来你只需接收这个观察者然后处理传过来的String变量就行(泛型)

当你不关心异常,或者说你已经在中间环节处理了异常的时候,你可以尝试用下:

Action1<String> onNextAction = new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
};


这就是一个最简单地观察者,只做onNext里面的操作,只需要把这个onNextAction 传到subscribe()函数里面就行

综合以上俩点,可以写成:

Observable.just("Hello, world!")
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});


4.功能加强

看完上面的,你可能还完全体会不到RxJava的好处,只会觉得功能很简单,很多东西有局限性完成不了你想要的逻辑。上面我提到了RxJava里面可以在中间环节添加操作,什么意思呢?

就是你可以随意对被观察者返回的数据进行操作再返回给观察者,还可以有目的地指定哪个操作运行在哪个线程,这里就要用到RxJava的操作符

比如map操作符,用于做Observable对象的变换,通俗一点讲,就是在可以改变传递的数据的类型

Observable.just("Hello, world!")
.map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.hashCode();
}
})
.subscribe(i -> System.out.println(Integer.toString(i)));


一开始被观察者返回的数据类型是String,通过map操作符,最终传递到观察者的数据类型是int,当然,操作符是支持多次调用的,所以可以更加线性地去处理我我们的每个逻辑

关于操作符的更多了解,请参考大头鬼的:

深入浅出RxJava(二:操作符)

/article/2268018.html

你需要了解更多操作符,才能让你写代码的时候更加行云流水
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: