Rxjava
首先来看一片文章
http://gank.io/post/560e15be2dca930e00da1083
- 学习一项复杂技术的策略,
不要求完全掌握, 只要求边缘切入,
逐步向内扩展。
Scheduler 的 API
在RxJava 中,Scheduler ——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程。RxJava 已经内置了几个 Scheduler ,它们已经适合大多数的使用场景:
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(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。 * observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
Rxjava 1.x 基本学习
官方文档
https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava
从应用中学习, 边界切入
https://blog.csdn.net/u012005313/article/details/72818125
Rxjava x2
利用Rxjava 处理网络数据
https://www.jianshu.com/p/0cd258eecf60
抛砖引玉, 系统学习
https://maxwell-nc.github.io/android/rxjava2-1.html
- Flowable和Observable作为被观察者的区别在于 前者支持背压,专为背压设计的
- map , flatMap
上面的Map操作符是把每一个元素转换成一个新的元素,但是flatMap操作符是把每一个元素转换成新的被观察者,每个被观察者发射的元素将会合并成新的被观察者,这些元素顺序输出,例如下面的:
- future
Future future = Flowable.just(1, 2, 3, 4, 5)
.toFuture();
背压(Backpressure)
背压是啥?
为什么要解决背压呢?
背压是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略。简而言之,背压是流速控制的一种策略。
1.x
https://zhuanlan.zhihu.com/p/24473022
2.x
https://blog.csdn.net/qq285016127/article/details/63010761
在RxJava2.0中,Observable(被观察者)&Observer(观察者)模型对背压的支持不够好,上一节我们已经谈过了。为了让代码更好的支持背压,我们对该模式使用新的对象来代替,这就是Flowable(被观察者)&Subscriber(观察者)。
不支持null了;
另外,2.x的Observable不再支持背压,可以作为不需要背压数据源的一个选择。
实现一个Backpressure
Flowable.range(1,1000)
.observeOn(Schedulers.newThread())
.subscribe(new Subscriber() {
private Subscription s;
@Override
public void onSubscribe(Subscription s) {
this.s = s;
s.request(1);
}
@Override
public void onNext(Integer integer) {
Log.i(TAG, "onNext: "+integer);
try {
Thread.sleep(1000);
s.request(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
}
});
Rxjava 2.x 异常处理
https://blog.csdn.net/qq285016127/article/details/57078120
这个异常可以是在发布的时候, 出现一个异常;
发布异常可以在链式调用内拦截;
也有可能创建被观察者时的异常, 这个异常通过java异常捕获就行,例如
捕获空指针异常
try {
Observable.just(null)
.subscribe(new Consumer
https://mcxiaoke.gitbooks.io/rxdocs/content/topics/Error-Handling.html
再说吧,,,