现在Android开发中最火的开源项目是什么?对,你没有看错,就是Rxjava。Rxjava绝对是大多数Android开发者眼中的第一网红。如果你找度娘或者谷歌,搜索Rxjava,各种分享的帖子一大片,而且其中不乏干货。我现在也只是将自己学习Rxjava的心得分享给大家,与网上的大神们自然没法比,如果有错误的地方,还希望批评指正。本篇先从最基本的讲起,后续我会不断更新,希望能与各位开发者们交流学习。
1. 什么是Rxjava?
要知道RxJava是什么,那么你应该先去了解一下Rx。Rx的全称是Reactive Extensions,直译过来就是响应式扩展。Rx基于观察者模式,他是一种编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流。ReactiveX.io给的定义是,Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华。Rx已经渗透到了各个语言中,有了Rx所以才有了 RxJava,Rx.NET、RxJS、RxSwift、Rx.rb、RxPHP等等。
一句话总结:Rxjava就是针对于Java语言的一个异步的响应式编程库。
2. 为什么要使用Rxjava?
好了,我们现在知道Rxjava是用来异步编程的。既然是异步编程,我们用Handler或者AsyncTask…….不行吗,为什么还要引入一个库,就单单为了紧跟潮流,好让自己有一种站在时代前沿的赶脚?
NO,一个词:简洁。重要的事情说三遍:简洁,简洁,简洁。
举个栗子:我们需要从数据库获取一组用户的链表数据,并展示出来。我们可以用AsyncTask后台查询数据库,获得的结果给Ui的适配器展示出来。简单示例代码:
publicclassSampleTaskextendsAsyncTask<Void,Void,List<Users>> {
privatefinal SampleAdapter mAdapter;
public SampleTask(SampleAdapter sampleAdapter) {
mAdapter = sampleAdapater;
}
@Override
protected List<Users>doInBackground(Void... voids) {
//fetch there results from the databaseand return them to the onPostExecute
List<Users> users =getUsersFromDatabase();
return users;
}
@Override
protectedvoid onPostExecute(List<Users> users){
super.onPostExecute(products);
// Checking if there are users on thedatabase
if(users ==null) {
//No users, presenting a view sayingthere are no users
showEmptyUsersMessageView();
return;
}
for(User user : users){
mAdapter.add(user);
}
mAdapter.notifyDataSetChanged();
}
}
现在有个新需求,要求只显示非guest的user,我们处理的方法是,在添加到adapter前加个条件判断是不是guset,或者改变数据库查询的条件。这个时候Rxjava的优势就显现出来了,换个姿势,我们Rx代码是这样子:
publicObservable<List<User>>
fetchUsersFromDatabase() {
return Observable.create(
new Observable.OnSubscribe<List<User>(){
@Override
publicvoidcall(Subscriber<?
super List<User>> subscriber){
// Fetch information from database
subscriber.onNext(getUserList());
subscriber.onCompleted();
}
});
}
像这样被调用:
fetchUsersFromDatabase()
.subscribeOn(Schedulers.io())
//will process everything in a new thread
.observeOn(AndroidSchedulers.mainThread())
//will listen the results on the main thread
.subscribe(
new Subscriber<List<User>>() {
@Override
publicvoidonCompleted() {
}
@Override
publicvoidonError(Throwable e) {
}
@Override
publicvoidonNext(List<User> users) {
//Do whatever you want with each user
}
});
开始改需求了哈
怎么不显示guests呢,RxJava分分钟过滤掉这种不速之客:
fetchUsersFromDatabase()
.filter(
new Func1<User, Boolean>() {
@Override
public Boolean
call(User user) {
//only return the users which are not guests
return !user.isGuest();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
new Subscriber<User>() {
@Override
publicvoidonCompleted() {
}
@Override
publicvoidonError(Throwable e) {
/*Check if there was any error while retrieving from database*/
}
@Override
publicvoidonNext(User user) {
//Do whatever you want with each usr
}
}
);
传统的方式,即便是个简单的变更,为了保持优雅的接口化编程,我们也得创建新接口,重构代码来实现过滤。但是使用RxJava让这一切变得优雅了,我们只需要一个被观察者用来获取所有的信息,让后你就可以尽情的用这些方法来过滤获取你想要的数据。 可能你又会说了,ok,这是很好很易读的结构,但是这似乎使代码量变多了呢。不错,表面上看代码量是增加了,但你仔细对比需求改变前后的代码,只是多了一个.filter()操做而已,所以我们说的简洁不是代码量,而是逻辑上的简洁。如果后期你要增加其他操作,就一直这样.XXX就可以了,神马接口回调统统都木有,是不是很简洁!这就是传说中的流式风格,链式调用。如果就是觉得代码量太多,看着心情不爽,你可以尝试一下Retrolambda,整套代码绝对清爽。笔者对其了解不多,就不多做介绍,大家自己度娘谷歌吧。
好了,因为是Rxjava的初相识,大家就没必要深究代码,示例只是告诉大家Rxjava的优势究竟在哪里,后面我会给大家慢慢介绍的。
3.怎样才能更快的上手Rxjava?
在这里就我个人学习Rxjava的经验简单分享一下,如果你是初次看到Rxjava,希望能给你一个清晰的学习脉络,少走一些弯路。
a)掌握Rxjava的两大核心:观察者模式与异步。
异步在这里并不需要做太多的解释,因为在概念和使用上,并没有太多高深的东西。大概就是你脑子里想能到的那些多线程,线程切换这些东西。我会在后面会讲解它的用法。
我们主要来看看Rxjava里的观察者模式,我们以天线与电视塔为例来介绍:
如图,现在以电视塔与电视天线之间的关系为例来解释Rxjava中的观察者摸式。我们知道电视天线只能接受到电视塔发出的信号,你给他发wifi或者打电话他是绝对不会搭理你的。所以只要电视天线在电视塔的信号范围内,同时电视塔向外发射信号了,电视天线就能接收到信号并转化为有线信号,小伙伴们就可以愉快的欣赏电视节目了。重点来了,接下来我们以Rxjava的方式来理解这个过程:
亲们可以看到,我在电视天线下标注了Observer(观察者),因为天线不知道电视塔会在什么时候发信号,所以它就时刻准备着接收信号,只要电视塔发射信号,天线就接收并处理。换句话说,.天线24小时毫不松散的观察者电视塔有没有发信号,所以它是Observer(观察者)。
接着看,一个箭头指向电视塔,上面写着Subscriber(订阅)。上文已经提到,电视天线只能接收电视塔发射的信号,而不能接收wifi或者电话信号。可以理解为,制造者从生产它的那一刻就为它Subscriber(订阅)的是电视塔,所以它才能够接收到电视信号,也只观察电视塔发射的信号。
最后我们来看电视塔Observable(被观察者),电视塔主动向外发射信号,它才不管有没有那些天线即Observer(观察者)能接收到它的信号。
说到这Rxjava基本骨架已经出来了,首先得有Observer(观察者)和Observable(被观察者),然后Observer(观察者)必须Subscriber(订阅)Observable(被观察者),这样Observer(观察者)就可以接收到Observable(被观察者)发出的消息了。当然后面大家还会了解到变换的概念,这个稍微复杂一点。不过也好理解,你把天线换成电视机(即此时的Observer(观察者)是电视机,天线只是一个中间环节不予考虑),电视机是无法直接使用电视塔发出的信号的,必须通过天线转换后才能显示在幕上,所以必须有变换。
b)重点学习各种操作符合线程切换。Rxjava有许多操作符map,flatmap,还有上文提到的fliter对今后的开发会有很大帮助。还有线程切换scheduler可以灵活的在UI线程与其他线程间进行切换,都会在后文提到,这里只是给大家一个学习指导。
本次就分享这么多,后面还会有很大干货,敬请期待。
*文章参考了网上包括扔物线在内的诸多大神的文章,如有不妥之处,请通知我修改.