聊一聊 Rac
Rac 是什么
Rac 全称 Reactivecocoa,是一个应用于iOS和OS X开发的框架,它的灵感来自函数式 响应式编程。
Rac 做了什么
将原有的各种设计模式,包括 中心以及观察者模式各种『输入』,都抽象成了信号,通过信号的传递来处理这些行为。简化了事件的传递,每个部分只需要关注信号的传递及状态即可。最终将信号通过不同的组合,达成我们最终的目的。
Rac 的组成
1. 核心组件
- 信号源
RACStream及其子类; - 订阅者
RACSubscriber及其子类 - 调度器
RACScheduler及其子类 - 清洁工
RACDisposable及其子类
2. 组件间的关系
a. 订阅者订阅信号源后,调度器保证信号源的传递及顺序
b. 信号到达后,根据信号的状态,进行不同的操作
c. 操作完成后,通过清洁工清理掉信号源
Rac 的用处
- 处理异步或者事件驱动数据源
- 连接依赖的操作
- 并行地独立地工作
- 简化集合转换
Rac 的使用
对比 EventBus RxJava
EventBus
EventBus是一款针对Android设计的发布/订阅事件总线,使用订阅/发布模式让组件间的通信变得简单。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间的消息传递。
-
EventBus四大组成部分:- Publisher发布者
用于分发我们的Event事件,在EventBus中通过post方法进行分发传送。 - Subscriber订阅者
用于接受我们的事件,我们在订阅事件中处理我们接收的数据。 - Event事件
任何一个对象都可以作为事件,比如任何字符串,事件是发布者和订阅者之间的通信载体。 - EventBus
类似于中转站,将我们的事件进行对应的分发处理。
- Publisher发布者
-
优缺点
优点:
- 简化了组件之间的通信
- 将事件发送者和接收者分离
- 在
Activities,Fragments和background threads中表现良好 - 避免复杂且容易出错的依赖关系和生命周期问题
- 使代码更简单
- 性能开销小
- 代码量小(约50k左右)
缺点: 消息乱飞?不方便 Debug?
- 简化了组件之间的通信
-
使用
- 定义一个事件
public static class MessageEvent { /* Additional fields if needed */ }- 声明一个用于响应的方法,并且在适当的生命周期注册或注销
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { /* Do something */ }@Override public void onStart() { super.onStart(); <!-- 官方写法,但是如果不进行处理,可能会造成重复注册订阅,多次响应事件 EventBus.getDefault().register(this); --> // 通过 isRegistered 检查是否已经注册订阅 if (!EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().register(this); } } @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); }根据不同的应用场景,可以选择在不同的声明周期注册或移除订阅
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); }- 发布事件,事件发布后,订阅者中的响应方法就会受到事件
EventBus.getDefault().post(new MessageEvent());
RxJava
RxJava 在 GitHub 主页上的自我介绍是"a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库),核心可以总结为两个字:异步。说到根上,它就是一个实现异步操作的库。而它的异步实现,是通过一种扩展的观察者模式来实现的。
-
RxJava的四个基本概念-
Observable(可观察者,即被观察者)
决定什么时候触发事件以及触发怎样的事件。 -
Observer(观察者)
决定事件触发的时候将有怎样的行为。 -
subscribe(订阅)
创建了Observable和Observer之后,再用 subscribe() 方法将它们联结起来,整条链子就可以工作了 - 事件
-
-
使用
Observable.from(folders)
<!-- 降维,事件转换? -->
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
<!-- 事件过滤 -->
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
<!-- 类型转换? -->
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
<!-- 指定Observable自身在哪个调度器上执行 -->
.subscribeOn(Schedulers.io())
<!-- 指定一个观察者在哪个调度器上观察这个Observable -->
.observeOn(AndroidSchedulers.mainThread())
<!-- 事件响应? -->
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});












网友评论