0、Rxjava-可能是最详细的Rxjava

311 阅读4分钟

1 写这篇博客的初衷

首先概括一下:我想把Rxjava做一个系列尽量详细的记录下来,希望读者读了这篇文章后能够清楚的了解 Rxjava,了解到函数式响应式编程思想。

现在很多人都在谈论Rxjava,分为两派: 反对派认为java已经足够强,面向对象对特性及设计模式就能解决我的日常需求,没有必要使用复杂的Rxjva,只会增加学习和沟通成本; 支持派则认为它是一种思想上的创新,一种新的思想理念,可以把我们日常复杂的问题简单化去处理。

那么Rxjava到底需不需要学呢?

其实弊端很明显:

  • 1、它的学习成本大,把Rxjava仅仅当作一项新的技术框架来学很难理解到它的精髓,新的技术框架每年都有产生,而每年也都会有大量都框架慢慢过时,成本是否划算;
  • 2、项目中协作开发的沟通试错成本高(因为不是必须的技能,所以每个组员对它的了解程度不一样,很可能会错误的使用它);

笔者平时已经在大量使用了rxjava了,也反复在使用和不使用中动摇,从最简单的使用并了解它的语法糖,到后期查看它的源码原理,收获良多,因为它不仅仅是功能上的强大,也颠覆了平时的固有思维及编写习惯。

学习的好处是可以丰富自己的知识储备和看待问题的方式,可以使代码的阅读性、扩展性更强。

那么你对Rxjava或者说对响应式编程思想了解多少呢?

2 为什么使用Rxjava

响应式编程思想其实可以说是一种编程范式(计算机编程的基本风格或典型规范),如果说面向对象是抽象的名词,那么它则是抽象的动词。

更简单的来说,Rxjava就是把复杂的问题逐步拆分成细小的单元,通过事件流的方式传递,把这些细小单元逐步解决。

绝大多数功能都能用Rxjava来实现,它不仅大大节约了代码量还能让你的代码结构更加清晰化(可以看到事件处理的流程,也就是数据流的传递)。

让我们来看下想要实现定时器功能java和Rxjava的方式有什么不一样:

普通实现

findViewById(R.id.interval).setOnClickListener(new View.OnClickLinsener(){
    @override
    public void onClick() {
        handle.post(runnable);
    }
});

int count = 0;
Handle handle = new Handle();
Runnable runnable = new Runnable(){
    @override
    public void run() {
        count++;
        if(count < 3) {
            // 你要做的事情
            do();
            handle.postDelay(this , 1000);
        } else {
            handle.removeCallbacks(this);
        }
    }
};
Rxjava实现

findViewById(R.id.interval).setOnClickListener(new View.OnClickLinsener(){
    @override
    public void onClick() {
        startInterval();
    }
});

// 参数说明:
// 参数1 = 第1次延迟时间;
// 参数2 = 间隔时间数字;
// 参数3 = 时间单位;
void startInterval() {
    // 该例子发送的事件序列特点:延迟0s后发送事件,每隔1秒产生1个数字(从0开始递增1,无限个)
    Observable.interval( 0, 1, TimeUnit.SECONDS)
        .takeWhile(new Predicate<Long>(){
            @Override
            public boolean test( Long integer) throws Exception {
                // 当发送的数据满足<3时,才发送Observable的数据
                return (integer<3);
            }
        })
        .subscribe(new Observer<Long>() {
                @Override
                public void onSubscribe(Disposable d) {
                }
    
                @Override
                public void onNext(Long value) {
                    // 你要做的事情
                    do();
                }
    
                @Override
                public void onError(Throwable e) {
                }
    
                @Override
                public void onComplete() {
                }
    
            });
}

上文的对比可以看出:用普通java写法,需要单独创建多个对象及方法,需要处理很多的细节;而采用Rxjava的方式,在使用高阶函数和链式结构可以很快观测出该函数的用途,不用处理细节,这也是函数式编程的优点。

3 该如何学习Rxjava

你可能会把各个知识点都过一遍,找个生动的视频学一遍,把demo都敲一遍吗?要不你觉得学习得晕头转向,要不你以为自己学会了过不了多久时间你就会忘记它。

那该如何学习Rxjava呢?静思笃行

  • 静:冷静下来,不要学习是因为自己一时的热情,学习一段时间后就把它抛弃了
  • 思:思考它为什么能这么做,内部是如何实现的(读源码最能体会),它这样做的好处是什么,了解其一其它的也就慢慢融会贯通了,它的操作符也只是实现手段而已
  • 笃行:在你平时工作中去使用它,不要怕错,既然学有所得,就要努力践履所学,使所学最终有所落实,做到“知行合一”

4 开启Rxjava之旅

如果你对Rxjava感兴趣的话,可以开始下面的学习啦。 如果有些概念模糊的可以先简略了解,随着使用对它的认识会更加深刻。

demo地址

RxJava:Rxjava简介

RxJava:Rxjava基础

RxJava:创建操作符

RxJava:RxJava线程调度器Scheduler

RxJava:变换操作符

RxJava:过滤操作符

RxJava:条件(布尔)操作符

5 最后的话

抱有一颗好奇心去学习,学习别人的优点,也学习它的不足,一起共同进步。

6 参考资料

  • 书籍 《Rxjava2.x实战》