RxJava简介与入门(一)

作者: SherlockXu8013 | 来源:发表于2017-10-24 11:17 被阅读73次

    前言

    最近在学习RxJava的过程中,越发感受到这个框架的强大,对于提升开发效率,降低维护成本有很大的作用。有必要强行安利一波,一起来看看RxJava简介,基本概念,原理与使用,本篇主要介绍RxJava的简介。

    响应式编程ReactiveX

    RxJava是ReactiveX中使用Java语言实现的版本,那什么是ReactiveX呢?ReactiveX就是一种新兴的编程模式--响应式编程,定义为一种基于异步数据流概念的编程模式,可分解为"观察者模式+迭代器模式+函数式编程"。

    扩展的观察者模式

    有关观察者模式的概念不懂得童鞋可自行google,这里就不再赘述。RxJava扩展了观察者模式,通过使用可观察的对象序列流来表述一系列事件,订阅者进行占点观察并对序列流做出反应(或持久化或输出显示等等);借鉴迭代器模式,对多个对象序列进行迭代输出,订阅者可以依次处理不同的对象序列;使用函数式编程思想,简化繁琐的逻辑代码。

    而RxJava的核心便是被观察者Observables与观察者Observer,由Observables发出一系列的事件,Observer通过subscribe()方法进行订阅接收事件并进行处理,类似观察者模式,不同之处在于,若没有观察者,被观察者是不会发出任何事件的。

    所以说,RxJava本质上是一个异步操作库,是一个能让你用极其简洁的逻辑去处理繁琐复杂任务的异步事件库。

    例子

    概念理解起来未免晦涩难懂,我们来看一个例子:

    有这样一个需求:开发一个类似房天下的App,某功能需要检索出某一片区所有住宅小区中购房总价<200W的房源并展示出来。先看原始实现方式:

     new Thread(new Runnable() {
        @Override
        public void run() {
            //获取要查询的小区集合
            List<Community> communities = getCommunities();
            for (Community community : communities) {
                //获取小区中的房源集合
                List<House> houses = community.getHouses();
                for (House house : houses) {
                    if (house.getPrice() < 200) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //显示查询出来的房源信息
                                ShowSearchedHousesMessage();
                            }
                        });
                    }
                }
            }
        }
    }).start();
    

    RxJava实现方式:

    //获取要查询的小区集合
    List<Community> communities = getCommunities();
    Observable.from(communities)
            .flatMap(new Func1<Community, Observable<House>>() {
                @Override
                public Observable<House> call(Community community) {
                    return Observable.from(community.getHouses());
                }
            })
            .filter(new Func1<House, Boolean>() {
                @Override
                public Boolean call(House house) {
                    return house.getPrice() < 200;
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<House>() {
                @Override
                public void call(House house) {
                    //显示查询出来的房源信息
                    ShowSearchedHousesMessage();
                }
            });
    

    RxJava的实现方式看上去更复杂了,但是它的逻辑很清晰简洁,修改起来很方便,后期维护起来也能提高工作效率。再来看下配合Lambda表达式:

    //获取要查询的小区集合
    List<Community> communities = getCommunities();
    Observable.from(communities)
            .flatMap(community -> Observable.from(community.getHouses())
            .filter(house -> house.getPrice() < 200)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(house -> ShowSearchedHousesMessage());
    

    搭配上Lambda表达式,代码的简洁度是不是更上一层楼呢?

    不懂Lambda表达式的童鞋可以跳转到我写的另一篇讲解Lambda表达式的文章:
    Android开发之Lambda表达式基本语法与应用

    总结

    到此,本篇关于RxJava的简介就介绍完毕了,本篇的目的主要是给大家引入一个RxJava的概念,以便后期更轻松的理解RxJava的原理与运作。下一篇我们再来一起详细研究RxJava的原理及如何使用。

    技术渣一枚,有写的不对的地方欢迎大神们留言指正,有什么疑惑或者建议也可以在我Github上RxJavaDemo项目Issues中提出,我会及时回复。

    附上RxJavaDemo的地址:
    RxJavaDemo

    相关文章

      网友评论

        本文标题:RxJava简介与入门(一)

        本文链接:https://www.haomeiwen.com/subject/sostpxtx.html