1 写这篇博客的初衷
首先概括一下:我想把Rxjava做一个系列尽量详细的记录下来,希望读者读了这篇文章后能够清楚的了解 Rxjava,了解到函数式响应式编程思想。
现在很多人都在谈论Rxjava,分为两派: 反对派认为java已经足够强,面向对象对特性及设计模式就能解决我的日常需求,没有必要使用复杂的Rxjva,只会增加学习和沟通成本; 支持派则认为它是一种思想上的创新,一种新的思想理念,可以把我们日常复杂的问题简单化去处理。
那么Rxjava到底需不需要学呢?
其实弊端很明显:
- 1、它的学习成本大,把Rxjava仅仅当作一项新的技术框架来学很难理解到它的精髓,新的技术框架每年都有产生,而每年也都会有大量都框架慢慢过时,成本是否划算;
- 2、项目中协作开发的沟通试错成本高(因为不是必须的技能,所以每个组员对它的了解程度不一样,很可能会错误的使用它);
笔者平时已经在大量使用了rxjava了,也反复在使用和不使用中动摇,从最简单的使用并了解它的语法糖,到后期查看它的源码原理,收获良多,因为它不仅仅是功能上的强大,也颠覆了平时的固有思维及编写习惯。
学习的好处是可以丰富自己的知识储备和看待问题的方式,可以使代码的阅读性、扩展性更强。
那么你对Rxjava或者说对响应式编程思想了解多少呢?
2 为什么使用Rxjava
响应式编程思想其实可以说是一种编程范式(计算机编程的基本风格或典型规范),如果说面向对象是抽象的名词,那么它则是抽象的动词。
更简单的来说,Rxjava就是把复杂的问题逐步拆分成细小的单元,通过事件流的方式传递,把这些细小单元逐步解决。
绝大多数功能都能用Rxjava来实现,它不仅大大节约了代码量还能让你的代码结构更加清晰化(可以看到事件处理的流程,也就是数据流的传递)。
让我们来看下想要实现定时器功能java和Rxjava的方式有什么不一样:
普通实现
findViewById(R.id.interval).setOnClickListener(new View.OnClickLinsener(){
@override
public void onClick() {
handle.post(runnable);
}
});
int count = 0;
Handle handle = new Handle();
Runnable runnable = new Runnable(){
@override
public void run() {
count++;
if(count < 3) {
// 你要做的事情
do();
handle.postDelay(this , 1000);
} else {
handle.removeCallbacks(this);
}
}
};
Rxjava实现
findViewById(R.id.interval).setOnClickListener(new View.OnClickLinsener(){
@override
public void onClick() {
startInterval();
}
});
// 参数说明:
// 参数1 = 第1次延迟时间;
// 参数2 = 间隔时间数字;
// 参数3 = 时间单位;
void startInterval() {
// 该例子发送的事件序列特点:延迟0s后发送事件,每隔1秒产生1个数字(从0开始递增1,无限个)
Observable.interval( 0, 1, TimeUnit.SECONDS)
.takeWhile(new Predicate<Long>(){
@Override
public boolean test( Long integer) throws Exception {
// 当发送的数据满足<3时,才发送Observable的数据
return (integer<3);
}
})
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long value) {
// 你要做的事情
do();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
上文的对比可以看出:用普通java写法,需要单独创建多个对象及方法,需要处理很多的细节;而采用Rxjava的方式,在使用高阶函数和链式结构可以很快观测出该函数的用途,不用处理细节,这也是函数式编程的优点。
3 该如何学习Rxjava
你可能会把各个知识点都过一遍,找个生动的视频学一遍,把demo都敲一遍吗?要不你觉得学习得晕头转向,要不你以为自己学会了过不了多久时间你就会忘记它。
那该如何学习Rxjava呢?静思笃行
- 静:冷静下来,不要学习是因为自己一时的热情,学习一段时间后就把它抛弃了
- 思:思考它为什么能这么做,内部是如何实现的(读源码最能体会),它这样做的好处是什么,了解其一其它的也就慢慢融会贯通了,它的操作符也只是实现手段而已
- 笃行:在你平时工作中去使用它,不要怕错,既然学有所得,就要努力践履所学,使所学最终有所落实,做到“知行合一”
4 开启Rxjava之旅
如果你对Rxjava感兴趣的话,可以开始下面的学习啦。 如果有些概念模糊的可以先简略了解,随着使用对它的认识会更加深刻。
5 最后的话
抱有一颗好奇心去学习,学习别人的优点,也学习它的不足,一起共同进步。
6 参考资料
- 书籍 《Rxjava2.x实战》