Android进阶

Rxjava从入门到深入

2016-08-06  本文已影响0人  buchuqi2677

RxJava的牛逼在哪里?

1:提供了对事件序列进行变换的支持

所谓变换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列

2:实现了对线程的自由控制

通过Scheduler进行对call()中发射数据的线程控制,subscribeOn(Schedulers.io()) 这个线程的核心底层是基于线程池来完成,一定要清楚多线程与rxjava结合应用

在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线程,就需要用到 Scheduler (调度器)。

Scheduler调度器的api

在RxJava 中,Scheduler ——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程。RxJava 已经内置了几个 Scheduler ,它们已经适合大多数的使用场景:

另外, Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。

有了这几个 Scheduler ,就可以使用 subscribeOn() 和 observeOn() 两个方法来对线程进行控制了。

资料收集

Rxjava是什么

Rx其实就是一个使用可观察数据流进行异步编程的编程接口,结合了观察者模式、迭代器模式和函数式编程的精华。说白了就是针对一个数据流有着一套严格规范以及一套很牛逼的实现方式的一个库。

Rx = Observables(数据源) + LINQ(各种操作) + Schedulers(调度器)

我们用个思维导图来分辨一下:

常见操作分类.png

只看概念有点懵逼,是不是,没关系!下面来实例详细说明

Observable.from(folders)
    .flatMap(new Func1<File, Observable<File>>() {
        @Override
        public Observable<File> call(File file) {
            return Observable.from(file.listFiles());
        }
    })
    .filter(new Func1<File, Boolean>() {
        @Override
        public Boolean call(File file) {
            return file.getName().endsWith(".png");
        }
    })
    .map(new Func1<File, Bitmap>() {
        @Override
        public Bitmap call(File file) {
            return getBitmapFromFile(file);
        }
    })
    .subscribeOn(Schedulers.io())//上面的call()发生在IO线程里
    .observeOn(AndroidSchedulers.mainThread())//回调发生在主线程里
    .subscribe(new Action1<Bitmap>() {
        @Override
        public void call(Bitmap bitmap) {
            imageCollectorView.addImage(bitmap);
        }
    });

加载图片将会发生在 IO 线程,而设置图片则被设定在了主线程。这就意味着,即使加载图片耗费了几十甚至几百毫秒的时间,也不会造成丝毫界面的卡顿。

我们根据上面的思维导图再来剖析一下这个例子:
看到这里应该对Rx有个基本的了解了!

Rxjava的核心原则观察者模式

没错核心就是观察者模式!在Rxjava的观察者模式当然也是,Observable
(被观察者)、 Observer (观察者),那么观察者,被观察者也有了,还差一个沟通的桥梁那么 subscribe(订阅)就来了,来实现订阅关系。

来个实例

 Observable.just("android","java","c")
.observeOn(Schedulers.io())
.subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                //这里当onNext()执行三遍后才会最终执行到这里
            }

            @Override
            public void onError(Throwable e) {
                //onCompleted(),onError()是互斥事件
            }

            @Override
            public void onNext(String s) {
            Logger.e("======"+s);//会依次打印出
            }
        })

上面的实例中看到怎么没有看到Observer (观察者),其实Subscriber就是Observer 的抽象类。下面看一下这三个方法

 Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("Hello");
        subscriber.onNext("Hi");
        subscriber.onNext("Aloha");
        subscriber.onCompleted();
    }
});

String[] words = {"Hello", "Hi", "Aloha"};
Observable observable = Observable.from(words);}

 Observable observable = Observable.just("Hello", "Hi", "Aloha");

上面三个方法其实都是一样的,只不过下面两个会依次调用

// 将会依次调用:
onNext("Hello");
onNext("Hi");
onNext("Aloha");
onCompleted();

下面来了解下Rxjava常见的操作处理分类

常见操作分类.png
上一篇 下一篇

猜你喜欢

热点阅读