更多文章请点击链接http://77blogs.com/?p=162

转载请标明出处https://www.cnblogs.com/tangZH/p/12088300.htmlhttp://77blogs.com/?p=162

RxJava究竟是啥,从根本上来讲,它就是一个实现异步操作的库,并且能够使代码非常简洁。它的异步是使用观察者模式来实现的。

关于观察者模式的介绍,可以看我这一篇文章:

https://www.cnblogs.com/tangZH/p/11175120.html

这里我主要讲RxJava的一些基本用法,基本案例,原理的话暂时不深究:

一、自己构造事件

Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter emitter) {
int i = getNumber();
if (i < 0) {
emitter.onComplete();
return;
} else {
Log.d(TAG, Thread.currentThread().getName());
emitter.onNext(i);
emitter.onComplete();
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, Thread.currentThread().getName());
Log.d(TAG, integer + "");
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception { }
});

RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer

onNext():方法用来发送事件。

下面看看其他两个方法:

  • onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。
  • onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。
  • 在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

讲一下我们上面的例子,上面这个例子是采用简洁的链式调用来写的:

首先使用 create() 方法来创建一个 Observable ,并为它定义事件触发规则,然后通过emitter.onNext(i)传递出来,.subscribeOn(Schedulers.io())便是指定该事件产生的所在的线程为子线程,.observeOn(AndroidSchedulers.mainThread())指定观察者执行的线程为主线程。这时候为止返回的对象为Observable对象。

然后该Observable对象subscribe绑定观察者(也就是观察者进行订阅),里面有接收被观察者发出来的事件,有一个成功的方法,和一个失败的方法,这样就实现了由被观察者向观察传递事件。

二、对集合里的数据进行变换

        List<Integer> list = new ArrayList<Integer>() {
{
add(0);
add(1);
add(2);
}
};
Observable.fromIterable(list).map(new Function() {
@Override
public Object apply(Object o) throws Exception {
int i = (int) o + 1;
return String.valueOf(i);
}
})
.toList()
.toObservable().subscribeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(Object o) throws Exception {
Log.d(TAG, o.toString());
}
});

且看,我们需要对某个集合里面的数据一一进行变换,然后发送出来执行其他操作。

上面便是对集合里面的每一项进行加一操作,然后再转换为String类型,然后toList(),组合成集合发送出来,最后在观察者方法中打印出每一项。

三、合并执行

定义两个被观察者,各自产生事件,然后合并在一起,发送给一个观察者。

首先定义我们上面第一个例子的被观察者,用于发送一个数字:

        Observable observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter emitter) {
int i = getNumber();
if (i < 0) {
emitter.onComplete();
return;
} else {
Log.d(TAG, Thread.currentThread().getName());
emitter.onNext(i);
emitter.onComplete();
}
}
})
.subscribeOn(Schedulers.io());

其次再定义我们上面第二个例子的被观察者:

        List<Integer> list = new ArrayList<Integer>() {
{
add(0);
add(1);
add(2);
}
};
Observable observable2 = Observable.fromIterable(list).map(new Function() {
@Override
public Object apply(Object o) {
int i = (int) o + 1;
return String.valueOf(i);
}
})
.toList()
.toObservable().subscribeOn(Schedulers.io());

最后将这两个被观察者的事件合并起来发送给一个观察者:

        Disposable disposable = Observable.zip(observable1, observable2, new BiFunction() {
@Override
public Object apply(Object o, Object o2) throws Exception {
int i = (int) o;
String k = (String) ((List) o2).get(0);
return k + i;
}
})
.subscribe(new Consumer() {
@Override
public void accept(Object o) {
Log.d(TAG, (String) o);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) {
Log.d(TAG, throwable.getMessage());
}
});

zip方法,顾名思义,有点类似与于打包的意思。

o为被观察者1返回的结果,o2为被观察2返回的结果,将这两个结果一起处理后发送给观察者。打印出来。

现在先介绍这几个,找个时间再整理一些其他的用法以及原理实现。

最新文章

  1. 自定义滚动条样式(jQuery插件、Webkit、IE)
  2. python核心编程学习记录之数字
  3. 转载:Clear Float
  4. [ZZ] C++ pair
  5. Linux下high CPU分析心得【非原创】
  6. 怎么知道我的laravel 是几版本的
  7. js调DLL类库中的方法实现(非com组件形式)
  8. Conda常见命令
  9. Codeforces 1110D. Jongmah 动态规划
  10. Hadoop小文件存储方案
  11. 【Ray Tracing The Next Week 超详解】 光线追踪2-7 任意长方体 &amp;&amp; 场景案例
  12. AngularJS中$interval和$timeout的使用
  13. OpenCV——积分图计算
  14. CodeReview工具Gerrit的python库pygerrit2
  15. 网站流量分析指标-PV/UV/PR/ip分析及区别
  16. 内存管理 初始化(五)kmem_cache_init 初始化slab分配器(上)
  17. express + mongodb 搭建一个简易网站 (三)
  18. kill 的常用信号
  19. Struts2通配符
  20. 安装TeX及中文支持

热门文章

  1. 使用 ALinq 实现 Linq to MySQL【转】
  2. 通过无线网络使用ADB ( Connect to android with ADB over TCP )
  3. 参数类型 (Mapper.java)常用
  4. [USACO10HOL]赶小猪
  5. 数据结构实验之栈与队列三:后缀式求值(SDUT 2133)
  6. elasticsearch中文分词器(ik)配置
  7. plus.zip.compressImage 压缩报错{&quot;code&quot;:-5,&quot;message&quot;:&quot;输出图片失败&quot;}
  8. 有效管理进程的几个linux命令
  9. arcgis python 列出一个表所有字段
  10. 分布式系统的应用程序性能监视工具,专为微服务、云本机架构和基于容器(Docker、K8s、Mesos)架构而设计。 SkyWalking