RxJava是一个神奇的框架,用法很简单,但内部实现有点复杂,代码逻辑有点绕。我读源码时,确实有点似懂非懂的感觉。网上关于RxJava源码分析的文章,源码贴了一大堆,代码逻辑绕来绕去的,让人看得云里雾里的,既然用拆轮子的方式来分析源码比较难啃,不如换种方式,以造轮子的方式,将源码中与性能,兼容性,扩展性有关的代码剔除,留下核心代码带大家揭秘RxJava的实现原理。
什么是RxJava
-
<李> ?Rx是活性扩展的简写,翻译为响应的扩展。也就是通过由一方发出信息,另一方响应信息并作出处理的核心框架代码。李>
<李> ?该框架由微软的架构师埃里克·梅耶尔领导的团队开发,并在2012年11月开源。李>
<李> ?Rx库支持。net, JavaScript和c++等,现在已经支持几乎全部的流行编程语言了。李>
<李> ?Rx的大部分语言库由ReactiveX这个组织负责维护,比较流行的有RxJava/RxJS/Rx。净,社区网站是reactivex.io。李>
<李> ?RxJava作为一个流行的框架,其源码依托在GitHub,除了支持RxJava,针对安卓系统也除了一个支持框架RxAndroid
2。RxJava简化代码
一般我们在安卓项目中,如果想从后台获取数据并刷新界面,代码大概如下、下面我们来看一个例子:
新线程(){@Override
br/> @Override
super.run ();
(文件夹:文件夹){
文件[]文件=folder.listFiles ();
(文件文件:文件){
如果(file.getName () .endsWith (“.png")) {
最后一位图的位图=getBitmapFromFile(文件),
getActivity () .runOnUiThread(新Runnable () {@Override
br/> @Override
imageCollectorView.addImage(位图),
}
});
}
}
}
}
} .start ();
上面的代码经过多层嵌套后可读性太差了!如果你用了RxJava可以这样写:
Observable.from(文件夹)
.flatMap(新Func1<文件,Observable
调用文件(文件){
返回Observable.from (file.listFiles ());
}
})
.filter(新Func1<文件,Boolean> () {@Override
br/> @Override
返回file.getName () .endsWith (“.png");
}
})。地图(新Func1<文件,Bitmap> () {@Override
br/> @Override
返回getBitmapFromFile(文件),
}
})
.subscribeOn (Schedulers.io ())
.observeOn (AndroidSchedulers.mainThread ())
。订阅(新的Action1
br/> @Override
imageCollectorView.addImage(位图),
}
});
这样写的好处就是减少层次嵌套提高了代码的可读性,除了简化代码,RxJava还可以为每个方法提供特定的运行线程。
3。引入框架
目前RxJava已经升级为2.0版本,但为了能够更好的理解RxJava,我们可以从1.0版本开始学习。也为了让我们的安卓项目能够更好的使用RxJava,可以在项目中引入gradle脚本依赖:
编译“io.reactivex: rxandroid: 1.2.1”
编译“io.reactivex: RxJava: 1.1.6”
现在我们的项目已经支持RxJava的功能了。
4。响应式的核心
所谓的响应式,无非就是存在这样的2个部分,一部分负责发送事件/消息,另一部分负责响应事件/消息。
以前如果我们想看新闻,一般需要通过看报纸,比如,你对某个报刊杂志比较感兴趣,那么你首先要做3件事:
-
<李>
-
<李>提供你家的地址李>
-
<李>找到对应的报社李>
-
<李>去报社订阅整个月的报纸
经过了上面的流程,以后每天只要有新的报刊资料出来了,报社都会将杂志发送到你的家。
李>
将上面的例子进行代码抽象,步骤如下:
-
<李>
-
<李>提供观察者(因为你是关心杂志内容的人所以你是观察该事件的人)李>
-
<李>提供被观察者(只要有新的杂志出来就需要通知关心的人所以报社是被观察的对象)李>
-
<李>订阅(也就是观察者和被观察者之间要相互关联以便被观察的对象一变化就会马上通知观察该事件的对象)