Rxjava和Retrofit

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() {
                        @Override
                        public void accept(Object o) throws Exception {
                            
                            
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }

https://mcxiaoke.gitbooks.io/rxdocs/content/topics/Error-Handling.html

再说吧,,,

Rtrofit+Rxjava 2.x

你可能感兴趣的:(Rxjava和Retrofit)