RxJava简单入门

一.扩展的观察者模式

RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。

观察者模式之前写过系列博客,可移步阅读:

http://blog.csdn.net/a910626/article/details/50766019

Rx中的发布订阅模型实现图示:

Observable和Subscriber能完成任何事情,你的Observable可以是一个数据库查询,Subscriber获得查询结果然后将其显示在屏幕上。你的Observable可以是屏幕上的一个点击,Subscriber响应该事件并做处理。你的Observable可以从网络上请求数据,Subscriber将其显示在界面上,这是一个可以处理任何事情的通用框架。

二.RxJava的优势

清晰,简单,更符合人的思维,尤其是跟lambda表达式结合更是如此

函数式风格,方面的创建事件流和数据流

异步错误处理机制:传统的try cach没办法处理异步计算,Rx提供了合适的错误处理机制

轻松使用并发

三.RxJava应用场景

RxBinding节流(防止按钮的重复点击)

轮询

定时操作

RxPermissions

RxBus

RxJava与Retrofit结合处理网络请求

代替监听/观察模型

线程管理,提供线程池,线程切换(Schedulers)

解决嵌套回调(flatMap)

提供延时,Timer处理(interval)

四.如何学习RxJava

响应式编程的主要组成部分是observable、operator和subscriber。一般响应式编程的信息流如下所示:

observable->operator1->operator2->operator3->subscriber

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

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

observable产生数据,中间通过几个operator,也就是操作符,这个操作符是用来转换数据的。最终他将发给订阅者subscriber。也就是说observable是事件的产生者,subscriber是事件的消费者。

Observable负责产生数据,subscriber负责消费数据。

中间的operator负责数据的转化

多在项目中使用才可以精通。

五.类关系图

1.在RxJava中主要有4个角色:

? Observable

? Subject

? Observer

? Subscriber

Observable和Subject是两个“生产”实体,Observer和Subscriber是两个“消费”实体。说直白点Observable对应于观察者模式中的被观察者,而Observer和Subscriber对应于观察者模式中的观察者。Subscriber其实是一个实现了Observer的抽象类,后面我们分析源码的时候也会介绍到。Subject比较复杂,以后再分析。

2.Rxjava的事件回调方法(其实就对应着观察者的update方法)

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

? onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext() 发出时,需要触发 onCompleted() 方法作为标志。

? onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。

? 在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

3.Action1 Action0

Action extends Function

public interface Action0 extends Action {?    void call();?}

public interface Action2<T1, T2> extends Action {?    void call(T1 t1, T2 t2);?}

public interface Func0<R> extends Function, Callable<R> {?    @Override?    R call();?}

function
public interface Function {??}

public interface Func1<T, R> extends Function {?    R call(T t);?}

简单解释一下这段代码中出现的 Action1 和 Action0。 Action0 是 RxJava 的一个接口,它只有一个方法 call(),这个方法是无参无返回值的;由于 onCompleted() 方法也是无参无返回值的,因此 Action0 可以被当成一个包装对象,将 onCompleted() 的内容打包起来将自己作为一个参数传入 subscribe() 以实现不完整定义的回调。这样其实也可以看做将 onCompleted() 方法作为参数传进了subscribe(),相当于其他某些语言中的『闭包』。 Action1 也是一个接口,它同样只有一个方法 call(T param),这个方法也无返回值,但有一个参数;与 Action0 同理,由于 onNext(T obj) 和 onError(Throwable error) 也是单参数无返回值的,因此 Action1可以将 onNext(obj) 和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调。事实上,虽然 Action0 和 Action1在 API 中使用最广泛,但 RxJava 是提供了多个 ActionX 形式的接口 (例如 Action2, Action3) 的,它们可以被用以包装不同的无返回值的方法。

4.Subscriber vs Observer

subscriber = observer + subcription

Subscriber ,它跟 Observer 接口几乎完全一样,只是多了两个方法

onStart() : 它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。

unsubscribe() : 用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以避免内存泄露的发生。

虽然多了两个方法,但是基本实现方式跟Observer是一样的,所以暂时可以不考虑两者的区别。不过值得注意的是:

实质上,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。

5.线程控制

在RxJava中,Scheduler相当于线程控制器,可以通过它来指定每一段代码运行的线程。

RxJava已经内置了几个Scheduler,下面是总结:

Schedulers.immediate() : 直接在当前线程运行,相当于不指定线程。这是默认的Scheduler。

Schedulers.newThread() : 总是启用新线程,并在新线程执行操作。

Schedulers.io() : I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的Scheduler。行为模式和newThread()差不多,区别在于io()的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下io()比newThread()更有效率。不要把计算工作放在io()中,可以避免创建不必要的线程。

Schedulers.computation() : 计算所使用的Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个Scheduler使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在computation()中,否则 I/O 操作的等待时间会浪费 CPU。

AndroidSchedulers.mainThread() ,Android专用线程,指定操作在主线程运行。

那我们如何切换线程呢?RxJava中提供了两个方法:subscribeOn() 和 observeOn() ,两者的不同点在于:

subscribeOn() : 指定subscribe()订阅所发生的线程,即 call() 执行的线程。或者叫做事件产生的线程。(指定被观察者执行的线程)

observeOn() : 指定Observer所运行在的线程,即onNext()执行的线程。或者叫做事件消费的线程。(制定观察者执行的线程)

六.来个栗子

Observable<String> myObservable = Observable.create(
    new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> sub) {
            //sub就是观察者,发送一个字符串
            sub.onNext("Hello, world!");
            sub.onCompleted();
        }
    }
); 

Subscriber<String> mySubscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) { System.out.println(s); }  

    @Override
    public void onCompleted() { }  

    @Override
    public void onError(Throwable e) { }
};

myObservable.subscribe(mySubscriber);  

blog.csdn.net/qq122627018/article/details/51355871

时间: 2024-11-14 22:45:17

RxJava简单入门的相关文章

正则表达式简单入门

 正则表达式简单入门    正则表达式在平常编程中有着大量的应用,对于任何一个想学习编程的人来说,正则表达式是一个必须掌握的知识. 废话不多说,下面先对正则表达式做一个简单的入门介绍,在后续的文章中,将会进行详细的介绍.    一.元字符 元字符一共有12个:$ ( ) [ { ? + * . ^ \ | 元字符有特殊的含义,如果要使用其字面值,则必须对其进行转义. 如: \$  \*  \( 等等 二.控制字符或不可打印字符 \a  警报 \e  退出 \f  换页 \n  换行 \r 

程序员,一起玩转GitHub版本控制,超简单入门教程 干货2

本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制.帮助大家摆脱命令行工具,简单快速的使用GitHub. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注头条号.每日更新.也可以添加小编微信:fullstackCourse.一起交流,获取最新全栈教程信息.因为FQ原因,不能下载客户端的同仁,可以关注后回复“GitHub客户端”获取安装软件. 上篇教程:GitHub这么火,程序员你不学学吗? 超简单入门教程 干货 GitHub概念部分出现了一丝纰漏.为

iBatis简单入门教程

iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了. 官网为:http://www.mybatis.org/ 搭建iBatis 开发环境: 1 .导入相关的jar 包,ibatis-2.3.0.677.jar .mysql-connector-java-5.1.6

Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门

出处:http://www.cnblogs.com/SeeYouBug/p/6401737.html 一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数据的操作的一个封转.可以分为视图模型(view model)和领域模型(domain models),视图模型就是在视图与控制器之间传输数据的一个封转,而领域模型就是业务逻辑,后台数据模型等的一个集

Java日志系统---Logger之简单入门

Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢:) Java中关于日志系统的API,在 java.util.logging 包中,在这个包中,Logger类很重要. Logger类是用来记录 某个级别的日志消息: 级别共分为以下几类,从上倒下,级别依次下降: SEVERE(严重)------级别最高 WARNING(警告) INFO CONFIG

响应式网页设计简单入门(强烈推薦!!!!)

响应式网页设计简单入门 Overview: 构造基本的HTML页面 动态加载样式表 Viewport 字体缩放 侧边栏 导航菜单 图片自适应 其他 总结 说到响应式网页设计(Responsive web design),最近在谷歌加上碰到个奇葩贴子,通过一个原始到无法再简单的网页Motherfucking Website及满屏幕的fuck道出了网页设计的真谛,这孩子不是个激进分子就是个报复社会型的货没错,虽然整篇文章就像是泼妇骂街,但我特么是笑着读完的.. 统计了下全文共用Fuck (包括fuc

Android HttpGet() 请求简单入门实例

HttpClient httpclient = new DefaultHttpClient(); String url = "http://example.com"; List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add( new BasicNameValuePair( "param", "value" ) ); URI uri =

delphi指针简单入门

delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   X   and   Y   整数类型     3             P:   ^Integer;           //   P   指向整数类型的指针     4         begin     5             X   :=17; //   给   X   赋值     6

windows简单入门(1)

1.1 windows系统的关机 退出所有正在运行的程序,然后点击"关闭计算机"键关机,下面是"关闭计算机"的操作方法:                    图1-2 图1-1 1.2鼠标的操作 ① 鼠标指向一个图标 操作:移动鼠标,将其指针放到屏幕上某一对象上或位置 举例:将鼠标指针从屏幕中的某一处移动到"我的电脑"上,这样就指向了"我的电脑". ② 单击鼠标 操作:将鼠标指向某一对象后,快速按一下鼠标左键,并立即释放,这