异步操作库RxJava精炼详解第(一)课:RxJava理论讲解和简单实现

记住!:RxJava是一个异步操作库 — 适用于与后台服务器频繁交互的项目,执行异步任务频繁。

“我们来谈一谈哪些库会让开发变得更加困难,或者说开始的时候更困难。但总的来说,这些都是好工具。RxJava,对于那些没有听说过的人来说,这个库的想法是,过去的代码从A 点开始,到B 点结束。但在Android 世界中,移动开发世界中,这一切就都不一样了。*你从A 点开始。然后人们点击某些东西,所以你必须做些别的事情来响应。然后一个通知进来,你必须又做些事情。然后数据库请求出现了。Reactive努力使你的代码能够对你的应用程序中的发生的事情做出反应,帮助你更好的组织它们,而且方便移动。

 

起初很难,因为它有一个学习曲线。如果你正在看代码,特别是对于没有接触过RxJava 的人来说,会有许多不清楚的地方。最简单的就是网络。但是,如果你有几个标准的例子,你使用这些案例,并确保是最佳的做法,情况就会不一样了。当你开始拥有这些功能时,它们非常强大,你可以将其运用于应用程序中的任何地方,但是当你这样做的时候,每当雇用新的开发人员,你将不得不教会他们每个activity 是怎么工作的,这需要很小心。——《安卓开发常用工具和第三方库汇总》

一、前期基础知识储备

在读者看这篇文章以前,相信已经听过很多人聊起过RxJava了,但或许你和我一样,对RxJava到底是什么?有什么用?如何使用?还不是非常清楚,笔者写本篇文章的目的就在于给自己梳理一下学到的RxJava知识,在看了这么多博客、代码、介绍之后。

(1)RxJava的起源

时代背景:著名的Netflix公司(拍《纸牌屋》的)在2012年开始意识到他们的架构要满足他们庞大的用户群体已经变得步履维艰,因此他们决定重新设计架构来减少REST调用的次数。为了实现这一目标,他们决定尝试响应式,开始将微软公司运用的响应式编程思想.NET Rx迁移到JVM上面。

最终,第二年即2013年二月份,BenChristensen 和 Jafar Husain发在Netflix技术博客的一篇文章第一次向世界展示了RxJava。

(2)响应式编程概述

①是一种基于异步数据流概念的编程模式,我们可以对流进行操作。

②响应式编程的另一重要概念:事件——把现实生活中的一个事件映射到软件编程中

这个事件可以触发一个新的过程,触发另外一个事件。

(3)RxJava特点

RxJava是一个异步操作库。

l  易于并发从而更好的利用服务器的能力;

l  易于有条件的异步执行;

l  一种更好的方式来避免回调地狱;

l  一种响应式方法。

(4)RxJava的与众不同之处

从纯Java的观点看,RxJavaObservable类源自于经典的Gang Of Four的观察者模式。这是一种行为模式并提供一种以一对多的依赖来绑定对象的方法:即当一个对象发生变化时,依赖它的所有对象都会被通知并且会自动更新。而RxJava采用的观察者模式又和经典的观察者模式有所不同,我们又称其为“扩展的观察者模式

因为它添加了三个经典观察者模式缺少的功能:

生产者在没有更多数据可用时能够发出信号通知:onCompleted()事件。

生产者在发生错误时能够发出信号通知:onError()事件。

RxJava Observables 能够组合而不是嵌套,从而避免开发者陷入回调地狱。

二、上代码,具体实现一次RxJava操作

(1)点击事件与观察者模式

是不是看了上面的内容,还是有些模糊啊?正常,因为不了解RxJava的时候,看起来是不清楚,但是当你看完接下来的内容再返回去看,就会很清楚。首先,我们来看一个点击事件(点击是一个事件,又采用观察者模式,所以我们可以拿来分析最为恰当)

Button button1=(Button)findViewById(R.id.button1);
    button1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
        Log.i("定义属性响应按钮点击事件");
    }
});

这是笔者之前分析四种不同点击事件的文章里的一个点击示例,采用的是匿名内部类的实现方式。我们来看,里面一共涉及了几个东西:①button1-对象;②(new OnClickListener(){}-对象;③onClick()-方法;④setOnClickListener()-方法。点击事件一共涉及到的是2个对象,2个方法。这和扩展者模式中的四大元素密切相符:

被观察者;观察者;订阅;事件 ——①(new OnClickListener(){}是观察者,用来监听,随被观察者状态改变而更新;②button1是被观察者,自己发生变化,并通知被观察者;③setOnClickListener()是订阅方法,观察者订阅被观察者之后,就能接收到被观察者的变化;④onClick()是事件,点击事件执行的具体方法。

点击事件的核心思想——Button 自动调用 OnClickListener 的 onClick() 方法

这就是观察者模式本身的目的——“后台处理,前台回调”

现在,我们来做一下抽象,Button -> 被观察者、OnClickListener -> 观察者、setOnClickListener()-> 订阅,onClick() -> 事件,那么我们就得到了一个通用的观察者模式。

(2)RxJava的扩展的观察者模式

RxJava 作为一个异步操作库,使用的就是通用形式的观察者模式。

RxJava 有四个基本概念:Observable(可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。

与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted() 和 onError()。见第一节中onCompleted() 和 onError()的相关介绍。

(3)基本实现一次RxJava操作

build.gradle中添加依赖

compile 'io.reactivex:rxjava:1.0.14' 
compile 'io.reactivex:rxandroid:1.0.1' 

基本实现一次RxJava操作,分三步走:

①创建 观察者Observer;

Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};

②创建 被观察者Observable;

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("Hello");
        subscriber.onNext("World");
        subscriber.onCompleted();
    }
});
//其他常见的被观察者创建方法——just()、from()
Observable observable = Observable.just("Hello", "World");
// 将会依次调用:
// onNext("Hello");
// onNext("World");
// onCompleted();
String[] words = {"Hello", "World"};
Observable observable = Observable.from(words);
// 将会依次调用:
// onNext("Hello");
// onNext("World");
// onCompleted();

③创建Subscribe (订阅);

observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);

这样,由被观察者调用了观察者的回调方法,就实现了由被观察者向观察者的事件传递,即观察者模式。

三、上代码,具体实现一次异步操作

本文在文章开头就提出了“RxJava是一个异步操作库”,就是为了再三提醒读者和笔者本人,这是一个异步操作库,它专门用来处理多线程和异步任务问题。它很强大,因为它十分专业的处理异步操作问题;但它不能上天,因为它只能实现异步操作

上代码,实现一个非常常见的场景,从内存中读取图片,并显示在界面上,前一步是一个耗时的任务,需要开启线程处理,后一步是UI操作,只能在主线程中处理。

int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe<Drawable>() {
    @Override
    public void call(Subscriber<? super Drawable> subscriber) {
        Drawable drawable = getTheme().getDrawable(drawableRes));
        subscriber.onNext(drawable);
        subscriber.onCompleted();
    }
	.subscribeOn(Schedulers.io())//这一步是指定被观察者在I/O线程中,使用的是RxJava的调度器
	.observeOn(AndroidSchedulers.mainThread())//这一步是指定观察者在主线程中,使用的是RxAndroid的调度器
	.subscribe(new Observer<Drawable>() {
    @Override
    public void onNext(Drawable drawable) {
        imageView.setImageDrawable(drawable);
    }

    @Override
    public void onCompleted() {
    }

    @Override
    public void onError(Throwable e) {
        Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
    }
});

上面的代码中出现了三个关键的概念:

subscribeOn(),RxJava提供了subscribeOn()方法: 用于每个被观察者Observable对象,或者说指定 subscribe() 所发生的线程,即 Observable.OnSubscribe被激活时所处的线程。或者叫做事件产生的线程;

observeOn(),RxJava提供了observeOn()方法:用于每个观察者Subscriber对象或者说指定 Subscriber 所运行在的线程。或者叫做事件消费的线程;

Sceduler,调度器——用来指定观察者和被观察者在什么线程中运行。RxJava 遵循的是线程不变的原则,如果需要切换线程,就必须使用调度器。

调度器共有以下几类

1)Schedulers.immediate()——直接在当前线程运行,相当于不指定线程。

这个调度器允许你立即在当前线程执行你指定的工作,例如timeout()、timeInterval()、timestamp()

2)Schedulers.newThread()——启用新线程,并在新线程执行操作。

3)Schedulers.trampoline()——调度器将会按序处理队列,并允许队列中每一个任务。例如repeat()、retry()

4)Schedulers.io()——I/O 耗时操作(读写文件、读写数据库、网络信息交互等)。

5)Schedulers.computation()——计算所使用的 Scheduler,例如图形的计算。

这个是计算工作默认的调度器,它与I/O操作无关。例如buffer()、debounce()、delay()、interval()、sample()、skip()

 上面的是RxJava的调度器下面是RxAndroid的调度器!

6)AndroidSchedulers是RxJava库提供在安卓平台的调度器(指定观察者在主线程)

AndroidSchedulers.mainThread()——指定的操作将在 Android 主线程运行。

 (RxAndroid是RxJava家族的一部分。它基于RxJava1.0.x,在普通的RxJava基础上添加了几个有用的类。大多数情况下,它为Android添加了特殊的调度器。)

总结:本节内容是RxJava理论部分和简单的实现的相关讲解,学到这里,相信很多读者朋友对RxJava已经有了一个大概的认知——响应式编程及其事件调度观察者模式及其四大元素RxJava线程控制及其异步操作。接下来的文章里笔者将开始RxJava的第二部分讲解,这部分是RxJava的又一核心知识点——操作符。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值