Rxjava(一):与Rxjava初相识

现在Android开发中最火的开源项目是什么?对,你没有看错,就是Rxjava。Rxjava绝对是大多数Android开发者眼中的第一网红。如果你找度娘或者谷歌,搜索Rxjava,各种分享的帖子一大片,而且其中不乏干货。我现在也只是将自己学习Rxjava的心得分享给大家,与网上的大神们自然没法比,如果有错误的地方,还希望批评指正。本篇先从最基本的讲起,后续我会不断更新,希望能与各位开发者们交流学习。

 

1.      什么是Rxjava

要知道RxJava是什么,那么你应该先去了解一下RxRx的全称是Reactive Extensions,直译过来就是响应式扩展。Rx基于观察者模式,他是一种编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流。ReactiveX.io给的定义是,Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华。Rx已经渗透到了各个语言中,有了Rx所以才有了 RxJavaRx.NETRxJSRxSwiftRx.rbRxPHP等等。

一句话总结:Rxjava就是针对于Java语言的一个异步的响应式编程库。

2.      为什么要使用Rxjava?

好了,我们现在知道Rxjava是用来异步编程的。既然是异步编程,我们用Handler或者AsyncTask…….不行吗,为什么还要引入一个库,就单单为了紧跟潮流,好让自己有一种站在时代前沿的赶脚?

NO,一个词:简洁。重要的事情说三遍:简洁,简洁,简洁。

举个栗子:我们需要从数据库获取一组用户的链表数据,并展示出来。我们可以用AsyncTask后台查询数据库,获得的结果给Ui的适配器展示出来。简单示例代码:

publicclassSampleTaskextendsAsyncTask<Void,Void,List<Users>> {

privatefinal SampleAdapter mAdapter;

public SampleTask(SampleAdapter sampleAdapter) {

        mAdapter = sampleAdapater;

    }

    @Override

    protected List<Users>doInBackground(Void... voids) {

        //fetch there results from the databaseand return them to the onPostExecute

        List<Users> users =getUsersFromDatabase();

        return users;

    }

 

    @Override

    protectedvoid onPostExecute(List<Users> users){

        super.onPostExecute(products);

        // Checking if there are users on thedatabase

        if(users ==null) {

            //No users, presenting a view sayingthere are no users

            showEmptyUsersMessageView();

            return;

        }

        for(User user : users){

            mAdapter.add(user);

        }

       mAdapter.notifyDataSetChanged();

    }

}

现在有个新需求,要求只显示非guestuser,我们处理的方法是,在添加到adapter前加个条件判断是不是guset,或者改变数据库查询的条件。这个时候Rxjava的优势就显现出来了,换个姿势,我们Rx代码是这样子:

public Observable<List<User>> fetchUsersFromDatabase() {
    return Observable.create(new Observable.OnSubscribe<List<User>(){
        @Override
        publicvoidcall(Subscriber<? super List<User>> subscriber){
            // Fetch information from database
            subscriber.onNext(getUserList());
            subscriber.onCompleted();
        }
    });
}
像这样被调用:
fetchUsersFromDatabase()
.subscribeOn(Schedulers.io())
//will process everything in a new thread
.observeOn(AndroidSchedulers.mainThread())
//will listen the results on the main thread
.subscribe(new Subscriber<List<User>>() {
           @Override
            publicvoidonCompleted() {
            }
            @Override
            publicvoidonError(Throwable e) {
            }
            @Override
            publicvoidonNext(List<User> users) {
                //Do whatever you want with each user
            }
        });

开始改需求了哈 
怎么不显示guests呢,RxJava分分钟过滤掉这种不速之客:

fetchUsersFromDatabase()
        .filter(new Func1<User, Boolean>() {
            @Override
            public Boolean call(User user) {
                //only return the users which are not guests
                return !user.isGuest();
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<User>() {
                       @Override
                       publicvoidonCompleted() {
                       }
                       @Override
                       publicvoidonError(Throwable e) {
                           /*Check if there was any error while retrieving from database*/
                       }
                       @Override
                       publicvoidonNext(User user) {
                           //Do whatever you want with each usr
                       }
                   }
        );
传统的方式,即便是个简单的变更,为了保持优雅的接口化编程,我们也得创建新接口,重构代码来实现过滤。但是使用RxJava让这一切变得优雅了,我们只需要一个被观察者用来获取所有的信息,让后你就可以尽情的用这些方法来过滤获取你想要的数据。 可能你又会说了,ok,这是很好很易读的结构,但是这似乎使代码量变多了呢。不错,表面上看代码量是增加了,但你仔细对比需求改变前后的代码,只是多了一个.filter()操做而已,所以我们说的简洁不是代码量,而是逻辑上的简洁。如果后期你要增加其他操作,就一直这样.XXX就可以了,神马接口回调统统都木有,是不是很简洁!这就是传说中的流式风格,链式调用。如果就是觉得代码量太多,看着心情不爽,你可以尝试一下Retrolambda,整套代码绝对清爽。笔者对其了解不多,就不多做介绍,大家自己度娘谷歌吧。
好了,因为是Rxjava的初相识,大家就没必要深究代码,示例只是告诉大家Rxjava的优势究竟在哪里,后面我会给大家慢慢介绍的。
3.怎样才能更快的上手Rxjava?
在这里就我个人学习Rxjava的经验简单分享一下,如果你是初次看到Rxjava,希望能给你一个清晰的学习脉络,少走一些弯路。
a)掌握Rxjava的两大核心:观察者模式异步
异步在这里并不需要做太多的解释,因为在概念和使用上,并没有太多高深的东西。大概就是你脑子里想能到的那些多线程,线程切换这些东西。我会在后面会讲解它的用法。
我们主要来看看Rxjava里的观察者模式,我们以天线与电视塔为例来介绍:
                               电视天线(Observer观察者)  Subscriber (订阅) 电视塔(Observable被观察者)                                                                                                                                                                                                 
如图,现在以电视塔与电视天线之间的关系为例来解释Rxjava中的观察者摸式。我们知道电视天线只能接受到电视塔发出的信号,你给他发wifi或者打电话他是绝对不会搭理你的。所以只要电视天线在电视塔的信号范围内,同时电视塔向外发射信号了,电视天线就能接收到信号并转化为有线信号,小伙伴们就可以愉快的欣赏电视节目了。重点来了,接下来我们以Rxjava的方式来理解这个过程:
亲们可以看到,我在电视天线下标注了Observer(观察者),因为天线不知道电视塔会在什么时候发信号,所以它就时刻准备着接收信号,只要电视塔发射信号,天线就接收并处理。换句话说,.天线24小时毫不松散的观察者电视塔有没有发信号,所以它是Observer(观察者)
接着看,一个箭头指向电视塔,上面写着Subscriber(订阅)。上文已经提到,电视天线只能接收电视塔发射的信号,而不能接收wifi或者电话信号。可以理解为,制造者从生产它的那一刻就为它Subscriber(订阅)的是电视塔,所以它才能够接收到电视信号,也只观察电视塔发射的信号。
最后我们来看电视塔Observable(被观察者),电视塔主动向外发射信号,它才不管有没有那些天线即Observer(观察者)能接收到它的信号
说到这Rxjava基本骨架已经出来了,首先得有Observer(观察者)和Observable(被观察者),然后Observer(观察者)必须Subscriber(订阅)Observable(被观察者),这样Observer(观察者)就可以接收到Observable(被观察者)发出的消息了。当然后面大家还会了解到变换的概念,这个稍微复杂一点。不过也好理解,你把天线换成电视机(即此时的Observer(观察者)是电视机,天线只是一个中间环节不予考虑),电视机是无法直接使用电视塔发出的信号的,必须通过天线转换后才能显示在幕上,所以必须有变换
b)重点学习各种操作符合线程切换。Rxjava有许多操作符mapflatmap,还有上文提到的fliter对今后的开发会有很大帮助。还有线程切换scheduler可以灵活的在UI线程与其他线程间进行切换,都会在后文提到,这里只是给大家一个学习指导。
本次就分享这么多,后面还会有很大干货,敬请期待。
    *文章参考了网上包括扔物线在内的诸多大神的文章,如有不妥之处,请通知我修改.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值