加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ReactiveX简介

(2019-10-25 14:30:14)
标签:

it

android

rx

分类: Android开发
1. 什么是ReactiveX?
*ReactiveX是Reactive Extension的缩写,简写为Rx
*最初是LINQ的一个扩展,由微软架构师Erik Meijer领导的团队开发,2012年11月开源
*Rx是一个函数库,让开发者可以利用可观察序列和LINQ风格操作符来编写异步和基于事件的程序
*Rx = Observables(异步数据流) + LINQ(查询异步数据流) + Schedulers(异步数据流的并发处理)
*Rx库支持.NET、JavaScript、C++、Java、Android、iOS等

2. 为什么要使用ReactiveX?
*Rx 结合了观察者模式、迭代器模式和函数式编程的精华,提供了一套灵活高效的API来创建和处理数据流
*Rx的Observable模型可以让您对异步事件流使用各种简单、可组合的操作,就像操作数组等集合数据一样,从而把您从繁琐的回调函数中解放出来,使您的代码更具可读性,并且不易出现错误
*Observable、Subscriber、Scheduler等模型的提供让您无需关注异步编程的常见担忧,如线程创建、线程同步、线程安全、并发访问和非阻塞IO

3. ReactiveX官网?
http://reactivex.io/intro.html
中文翻译:https://mcxiaoke.gitbooks.io/rxdocs/content/Intro.html

4. ReactiveX开源地址?
https://github.com/ReactiveX

5 Android中如何使用ReactiveX?
1)首先引用RxJava和RxAnroid库
其中RxJava 是 ReactiveX 在 Java 上的开源实现,RxAndroid 是 RxJava针对Android平台的轻量级扩展。

implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.6' 
2)Android 中往往需要启动子线程去完成某些耗时操作(如网络请求、数据库加载数据),因为这些操作可能会导致UI线程卡顿或ANR。常见的方式Handler和AsyncTask代码繁琐,可读性差,且AsyncTask容易导致内存泄漏(线程持有Activity变量的实例,导致Activity无法被回收)。RxJava的出现让这种场景的实现变得非常简单而易于理解。

//创建可观察对象
Observable operationObservable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber observer) {
  observer.onNext(doNetworkOperation());
  observer.onCompleted();
}
});

//创建订阅者
Subscriber operationSubscriber = new Subscriber() {
@Override
public void onNext(String value) {
   Log.d(TAG, "Next: " + value);
}

@Override
public void onError(Throwable error) {
   Log.d(TAG, "Error: " + error.getMessage());
}

@Override
public void onCompleted() {
   Log.d(TAG, "Operation complete.");
}
};

//订阅
operationObservable.subscribe(operationSubscriber); 
3) Rx默认单线程执行,为了避免subscriber等待操作结果而反应迟钝的情况,可以使用observeOn()和subscribeOn()方法来指定不同的线程。

operationObservable.subscribeOn(Schedulers.io());    // subscribe on the I/O thread
operationObservable.observeOn(AndroidSchedulers.mainThread()); // observe on the UI Thread
这样Observable的call()被指定在I/O线程上执行,而Subscriber的onNext(), onCompleted() 和 onError()被指定在UI线程上执行。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有