1、创建被观察者以及发射一个Integer事件
//创建被观察者
Observable.create(
//创建发射器<要发射事件的类型>
new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
//发射事件
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
//发射完成事件
emitter.onComplete();
}
}
)
//订阅,使被观察者和观察者建立联系
.subscribe(
//创建观察者
new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("开始订阅");
}
@Override
public void onNext(Integer integer) {
System.out.println("接受事件"+integer);
}
@Override
public void onError(Throwable e) {
System.out.println("响应Error事件"+e);
}
@Override
public void onComplete() {
System.out.println("响应Complete事件");
}
}
);
运行结果:
2、快速发送传入的事件
①发送基本数据类型(Integer,Double,String等)
//快速创建,直接发送传入的事件
Observable
//最多只能传送10个参数
.just("数据1","数据2","数据3","数据4","数据5","数据6","数据7","数据8","数据9","数据10")
//订阅
.subscribe(
//创建观察者
new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
System.out.println("接收到的事件:"+s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
运行结果:
② 快速发送数组:
List<Boolean> lists=new ArrayList<>();
lists.add(true);
lists.add(true);
lists.add(true);
lists.add(false);
lists.add(false);
Observable.fromArray(lists)
.subscribe(
new Observer<List<Boolean>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(List<Boolean> booleen) {
System.out.println("接收到的事件:"+booleen);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
运行结果:
③传入数据,并且遍历出每个数据
List<Integer> lists=new ArrayList<>();
lists.add(0);
lists.add(2);
lists.add(3);
lists.add(4);
lists.add(5);
Observable.fromIterable(lists)
.subscribe(
new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
System.out.println("遍历到的每一个数据:"+integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
运行结果:
3、延迟创建:
应用场景:
1)、定时:经过多少时间以后,去做什么操作
2)、周期性:每隔多长的时间,需要自动执行什么操作
①、defer:(延迟)
作用:直到观察者订阅的时候,才会创建被观察者并且发送事件(举个我项目中的应用场景:我需要上传好多的图片,当时上传图片之前我要把图片进行压缩,
只用当图片全部压缩完成以后才去做上传操作,这时就可以使用defer)
//实现的效果是:当count=5的时候,观察者才订阅,这时被观察者会给观察者发送数据:100
int count=0;
//通过 defer 定义被观测者对象,注意这时被观测者是还没被创建的
final Observable<Integer> observable=Observable.defer(new Callable<ObservableSource<? extends Integer>>() {
@Override
public ObservableSource<? extends Integer> call() throws Exception {
return Observable.just(100);
}
});
for (int i = 0; i <= 10; i++) {
count++;
System.out.println("当前的数据是"+count);
if (count==5){
//这时观察者开始订阅,这时才会创建被观测者对象
observable.subscribe(
new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
System.out.println("接收到的数据:"+integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
}
运行结果:
②、Timer:作用就是延迟多长时间以后,去做某一操作(应用场景:一般用于检测)
//作用就是延迟多长时间以后发送一个数值:0(只会执行一次)
Observable.timer(1, TimeUnit.MINUTES)//延迟一分钟
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long aLong) {
System.out.println("接收到的数据"+aLong);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
运行结果:
③interval:(轮询)
作用:每隔多长时间发送一个事件(应用场景:比如NBA文字直播,设置间隔多长时间刷新数据)
发送的事件序列=从0开始,无限递增1的正数序列
//参数说明
//参数1:第一次延迟的时间
//参数2:间隔的时间
//参数3:时间单位
Observable.interval(5,2,TimeUnit.SECONDS)
.subscribe(
new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long aLong) {
System.out.println("接收到的数据:"+aLong);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
运行结果:
④intervalRange():有限次的轮询
//参数代表的意义:
//参数1:事件序列的起点
//参数2:事件的数量
//参数3:第一次事件的延迟发送时间
//参数3:时间间隔
//参数4:时间单位
Observable.intervalRange(5,10,3,2,TimeUnit.SECONDS)
.subscribe(
new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long aLong) {
System.out.println("接收到的事件:"+aLong);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
运行结果:
⑤range:范围
//参数的意义:
//参数1:时间序列的起点
//参数2:事件数量
Observable.range(5,10)
.subscribe(
new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
System.out.println("接收到的事件:"+integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
运行结果:
⑥rangeLong() 类似range()
4、案例:网络请求轮询
private void doNetForData() {
Observable
//延迟2秒发起请求,然后每个5秒无限轮询请求
.interval(2,5,TimeUnit.SECONDS)
//每隔5秒产生一个数字前,就发送一次网络请求,从而实现轮询效果
.doOnNext(
//Consumer是简易版的Observer
new Consumer<Long>() {
@Override
public void accept(@NonNull Long aLong) throws Exception {
System.out.println("现在是第:"+aLong+"次轮询");
RetrofitFactory.getRetrofit().create(NetApi.class)//发情网络请求
.requestData()
//在IO线程进行网络请求
.subscribeOn(Schedulers.io())
//切换到主线程获取网络请求结果
.observeOn(AndroidSchedulers.mainThread())
//订阅
.subscribe(
//创建观察者
new Observer<WordEntity>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(WordEntity wordEntity) {
System.out.println("请求到数据结果");
}
@Override
public void onError(Throwable e) {
System.out.println("请求数据出错"+e);
}
@Override
public void onComplete() {
}
}
);
}
}
).subscribe(
new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long aLong) {
System.out.println("interval发送的事件"+aLong);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
);
}
运行结果: