RxJava的学习
架构师之路 : https://www.jianshu.com/p/40a4b195a12a
一、RxJava1基本的元素
1.Observable
2.Observer
3.Subscription
4.OnSubscribe
5.Subscriber
二、RxJava2基本元素
1.Observable和Flowable
2.Observer和Subsrciber
3.Disposable和Subscription
4.相应的OnSubscribe
5.Emitter
三、RxJava的创建Observable操作符讲解
1.create :
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
Log.d(TAG,"Observable Test");
//定义事件队列
subscriber.onNext("aaaa");
subscriber.onCompleted();
}
});
2. just : 将为你创建一个Observable并自动为你调用onNext( )发射数据
Observable<String> observable = Observable.just("hello");
observable.subscribe(subscriber);
3 . from : 传入的数组
或Iterable
拆分成具体对象后
//定义要发送的事件集合
List<String> mList = new ArrayList<String>();
mList.add("aaaa");
mList.add("bbbb");
mList.add("cccc");
mList.add("dddd");
//定义Observable
Observable<String> observable = Observable.from(mList);
//进行订阅,开始发送事件
observable.subscribe(subscriber);
4. defer : 通过defer()
方法创建Observable,当观察者订阅时,才创建Observable,并且针对每个观察者创建都是一个新的Observable
//定义一个被观察者
Observable<String> observable = Observable.defer(new Func0<Observable<String>>() {
@Override
public Observable<String> call() {
Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("事件订阅开始");
}
});
return mObservable;
}
});
//订阅事件1,没产生一个订阅就会生成一个新的observable对象
observable.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d(TAG,"观察者2订阅事件 "+s);
}
});
//订阅事件2,没产生一个订阅就会生成一个新的observable对象
observable.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d(TAG,"观察者1订阅事件 "+s);
}
});
5 . interval : 创建一个按固定时间间隔发射整数序列的Observable,可用作定时器
Observable<Long> observable = Observable.interval(1, TimeUnit.SECONDS);
observable.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Log.d(TAG,"订阅时长为"+aLong);
}
});
6 . timer : 该方法可以在一定延迟之后发送特定事件
//定义被观察者,在2000毫秒后开始发送事件
Observable<Long> observable = Observable.timer(2000,TimeUnit.MILLISECONDS);
Subscriber<Long> subscriber = new Subscriber<Long>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Long aLong) {
Log.d(TAG,"收到事件啦");
}
};
Log.d(TAG,"开始订阅发送事件");
observable.subscribe(subscriber);
四、RxJava转换Observable的操作符
1.Map : map操作符就是通过制定一个Func1
对象,将原Observable
对象转换为另一个Observable对象并发射
//定义初始事件序列数组
Integer[] ints = {1, 2, 3};
//调用from逐个发射数据
//map方法把Intger类型转换为String类型
Observable.from(ints).map(new Func1<Integer, String>() {
@Override
public String call(Integer i) {
//对Integer数据进行处理,转换成String类型返回
return i + "号玩家";
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d(TAG,s+"加入游戏");
}
});
2.FlatMap : flatMap
也是用来做类型转换,不同于map
的是,flatMap
转换后得到的是一个Observable对象
//interval方法创建Observable对象,每隔1秒发送一个事件
//经过flatMap方法变化,将long类型的事件变换为一个新的Observable对象发射出去
subscription = Observable.interval(1, TimeUnit.SECONDS).flatMap(new Func1<Long, Observable<String>>() {
@Override
public Observable<String> call(final Long aLong) {
return Observable.create(new Observable.OnSubscribe<String>(){
@Override
public void call(Subscriber<? super String> subscriber) {
Log.d("testRX---next","test"+aLong);
subscriber.onNext(aLong+"");
}
});
}
//定义Subscriber对变换后的事件进行接收
}).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError");
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext" + s);
}
});
3.GroupBy
4.Buffer : buffer操作符将源Observable变换为一个新的Observable,这个新的Observable每次发射一组列表值而不是一个一个发射
Observale.just(1,2,3,4,5,6).buffer(3).subscribe(new Action1<List<Integer>>() {
5.Scan
6.Window
五、RxJava过滤Obserable的操作符
1.Debounce
2.Distinct : 去掉重复的数据项 1,2,3,2,3,4 ---->1,2,3,4
3.ElementAt : 打印指定数据项 A : 1,2,3,4 A.ElementAt(3) -----> 4
4.Filter : 过滤掉指定的判断 A : 1,2,3,4,5,6 if(数据源>3) ----> 4,5,6
5.First : 得到数据项的第一个数据 A : 1,2,3,4,5 A.Frist() ------>1
6.IgnoreElements : 获得Observable的对象,忽略onNext的方法,直接返回onComplete或者onError的方法
7.Last : 得到数据项的最后一个数据 A : 1,2,3,4,5 A.Last() -------> 5
8.Sample :
9.Skip : 跳过指定数据项的前几项 A: 1,2,3,4,5 A.Skip(2) ----> 3,4,5
10.SkipLast : 跳过指定数据的后几项 A:1,2,3,4,5 A.SkipLast(2) ---->1,2,3
11.Take : 拿到指定数据的前几项 A: 1,2,3,4,5 A.Take(2) ---->1,2
12.TakeLast : 拿到指定数据的后几项 A:1,2,3,4,5 A.TakeLast(2) ------>4,5
六、RxJava组合Observable的操作符
1.Zip : 对应项进行相应的合并,没有直接合并的直接抛弃 1,2,3 4,5,6,7 -----> 1+4=5 2+5=7 3+6=9
2.Merge : 把所有的数据源都合并为总的数据源 1,2,3 4,5,6 -----> 1,2,3,4,5,6
3.StartWith : 在原来数据源基础之前添加想要的数据源 A : 1 2 3 B : 4,5,6 -------> B.StartWith(A) 4,5,6,1,2,3
4.CombineLatest : 1,3,5 2,4,6 ----> 5 + 2 5 + 4 5 + 6 最后一个数据源和下一个数据源进行相应的操作
5.Join
6.SwitchOnNext
七、RxJava错误处理的操作符
1. onErrorReturn :
2.onErrorResumeNext :
3. onExceptionResumeNext : 和上面两个区别是:它可以捕获到异常,上面是不能捕获到异常信息的
4.retry : 当有一个错误发生时候,尝试回复正常
5.retryWhen : 当有一个异常发生之后,直到捕获到异常时候,才去报那个异常
八、线程的调度器
- Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
- Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。
- Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。
- Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
- Android 还有一个专用的
AndroidSchedulers.mainThread()
,它指定的操作将在 Android 主线程运行。
有了这几个 Scheduler ,就可以使用 subscribeOn() 和 observeOn() 两个方法来对线程进行控制了。
- subscribeOn(): 指定Observable(被观察者)所在的线程,或者叫做事件产生的线程。
- observeOn(): 指定 Observer(观察者)所运行在的线程,或者叫做事件消费的线程。
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
Log.d(TAG, Thread.currentThread().getName());
subscriber.onNext("aaaa");
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted");
Log.d(TAG, Thread.currentThread().getName());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext " + s);
}
});
posted on 2019-12-05 14:07 zhang11111wei 阅读(619) 评论(0) 编辑 收藏 举报