安卓RxJava学习第一弹

RxJava 到底是什么
一个词:异步。

RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。然而,对于初学者来说,这太难看懂了。因为它是一个『总结』,而初学者更需要一个『引言』。其实, RxJava 的本质可以压缩为异步这一个词。说到根上,它就是一个实现异步操作的库,而别的定语都是基于这之上的。

我们都知道RxJava是基于观察者模式的,但是和传统的观察者模式又有很大的区别。传统的观察者模式更注重订阅和发布这个动作,而RxJava的重点在于数据的“流动”。
如果我们把RxJava中的Observable看做一个盒子,那么Observable就是把数据或者事件给装进了这个易于拿取的盒子里面,让订阅者(或者下一级别的盒子)可以拿到而处理。这样一来,原来静态的数据/事件就被流动起来了。

我们知道人类会在河流中建设大坝,其实我们可以把RxJava中的filter/map/merge等Oberservable操作符看做成数据流中的大坝,经过这个操作符的操作后,大坝数据流被过滤被合并被处理,从而灵活的对数据的流动进行管制,让最终的使用者灵活的拿到。



RxJava基础

1.Rx的结构

响应式编程的主要组成部分是observable, operator和susbscriber(与Dan Lew的文章不同,这里把Operator也做为组成部分介绍,这样对结构的整体性会有更全面的认识)。
一般响应式编程的信息流如下所示:

Observable -> Operator 1 -> Operator 2 -> Operator 3 -> Subscriber

也就是说,observable是事件的生产者,subscriber是事件最终的消费者。

因为subscriber通常在主线程中执行,因此设计上要求其代码尽可能简单,只对事件进行响应,而修改事件的工作全部由operator执行。

2.最简单的模式

如果我们不需要修改事件,就不需要在observable和subscriber中插入operator。这时的Rx结构如下:

Obsevable -> Subscriber

这看起来很像设计模式中的观察者模式,他们最重要的区别之一在于在没有subscriber之前,observable不会产生事件。

代码如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        observable.subscribe(subscriber);
    }
    Observable observable=Observable.create(new Observable.OnSubscribe() {
        @Override
        public void call(Subscriber subscriber) {
            subscriber.onNext("Hello RxJava");
            subscriber.onCompleted();
        }
    });

    Subscriber subscriber = new Subscriber() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }
        @Override
        public void onNext(String s) {
            Log.e("msg", s);
        }
    };
}
如果使用JDK8的 lambda可以简化成

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Observable.just("Hello RxJava")
                .subscribe(s -> log(s));
    }
    private void log(String s) {
        Log.e("msg", s);
    }
}


3.加入operater

很多时候,我们需要针对处理过的事件做出响应,而不仅仅是Observable产生的原始事件。由于1.1中阐述的原因,这里就需要引入operator来处理原始事件。

这里以一个极简单的Markdown处理为例:假设输入的是Markdown格式的文件,最终展示文字的是一个WebView,这里就需要引入一个将Markdown转为HTML的operator,其代码如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Observable.just("#Basic Markdown to HTML").map(new Func1() {
            @Override
            public String call(String s) {
                if (s != null && s.startsWith("#")) {
                    return "

" + s.substring(1, s.length()) + "

"; } return null; } }).subscribe(s -> log(s)); } private void log(String s) { Log.e("msg", s); } }
简化之后超级简单:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Observable.just("#Basic Markdown to HTML")
                .map(s->s !=null&&s.startsWith("#") ? "

" + s.substring(1, s.length()) + "

" : null) .subscribe(s->log(s)); } private void log(String s) { Log.e("msg", s); } }
实际上执行Observable.subscribe()时,它会返回一个Subscrition,它代表了Observable和Subscriber之 间的关系。你可以通过Subscrition解除Observable和Subscriber之间的订阅关系,并立即停止执行整个订阅链。

  subscription.unsubscribe();
加上上面的代码就可以解除 Observable和Subscriber之间的订阅关系,并立即停止执行整个订阅链。

4.多线程

在开发过程中,为了避免阻塞UI线程,我们可能需要将某些工作放到指定线程执行。在 RxJava中,你可以通过subscribeOn()来指定Observer的运行线程,通过observeOn()指定Subscriber的运行线 程。这两个方法都是operator,因此它们可以像所有operator那样作用于任何的Observable。一个简单的例子如下:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Observable.just("Hello RxJava")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(s -> log(s));
    }

    private void log(String s) {
        Log.e("msg", Thread.currentThread().getName());
    }
}









你可能感兴趣的:(安卓)