RXJava原理_JavaScript的执行原理

RXJava原理_JavaScript的执行原理RXJava简单理解首先,rxjava是什么?其实对于刚接触rxjava的宝宝而言,只需要掌握两点:观察者模式异步处理观察上图,清楚生动刻画出了rxjava的观察者模式:开关(被观察者)作为的是事件的产生方(产生“on”和“off”这两个Event),有它发起这起开关的事件。台灯(观察者)作为事件的处理方(处理的是“on”和“off”这两个事件),被动的执行on和off。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

RXJava简单理解

首先,rxjava是什么?其实对于刚接触rxjava的宝宝而言,只需要掌握两点:

  • 观察者模式
  • 异步处理
    这里写图片描述
    观察上图,清楚生动刻画出了rxjava的观察者模式:
  • 开关(被观察者)作为的是事件的产生方(产生“on”和“off”这两个 Event),有它发起这起开关的事件。
  • 台灯(观察者)作为事件的处理方(处理的是“on”和“off”这两个事件),被动的执行on和off。
  • 在产生和完成中间,即在事件由产生方传递到处理方的过程中需要被加
    工,过滤和装换等操作。

重点来了

既然rxjava是基于观察者来组建自己的逻辑的,那么我们就来创建观察者(Observer/Subscriber),被观察者(Observable),然后二者建立订阅的关系(就好像那根电线连接台灯和开关)实现台灯观察开关的具体模式,并且在传递过程中对事件进行处理(比如:降低电压)。
Tips:
Observer是观察者的接口,Subscriber是实现该接口的抽象类,因此这两个类都可以作为观察者,只是Subscriber在Observer的基础上加入了一下拓展,加入了新的一些方法,所以一般更倾向于Subscriber作为观察者,下面我们就来敲一遍:

//创建被观察者(开关)
Observable switch = Observable.create(new Observable.onSubscribe<String>(){
@override
pubic void call(Subscriber<? super String> subscriber)
   {
   subscriber.onNext("on"); 
   subscriber.onNext("off");
   subscriber.onNext("on");
   subscribere.onCompleted();
   }
}); 

Jetbrains全家桶1年46,售后保障稳定

这是最原始的写法,创建了一个开关类(被观察者),产生了四个事件,开,关,开,结束,以上写法比较繁琐,下面两种比较偷懒的写法:

  • 模式一:
Observeable switch = Observable.just("on","off","on");
  • 模式二
String[] events = {
  
  "on","off","on"}; 
Observable switch = Observable.from(events);

其实以上两种写法都是对原生的写法进行了更加严密的封装,其实也是将被观察者(开关)的那些事件”on”,”off”,”on”进行包装成onNext(“on”)将这样的事件依次发送给观察者(台灯),最后再自己补上onComplete()事件。接下里我们创建观察者:

//创建观察者(原生模式)
Subscriber light = new Subscriber<String> {
   @override
   public void onCompleted(){
     Log.d(TAG,"has completed"); //事件处理完成时回调
  }
  @override
  public void onError(Throwable e){
  
  //事件出错回调 Log.e(TAG,"has error");
 }
 @override
 public void onNext(String s){
  
  //事件发生时回调
 Log.e(TAG,"handle this ..."+s);
 }

}

以上写法为原生的观察者写法,也是表较常见的写法,下面来个偷懒的写法:

  • 偷懒模式(非正式写法)
Action1 light = new Action1<String>{
@override
public void call(String s){
  Log.e(TAG,"handle this"+s);
}
}

为什么说它是非正式的写法,首先因为Action1是一个单纯的人畜无害的接口,和Observer没有任何关系,只不过Action1也可以当做观察者来使用,只不过它只能专门处理onNext)()事件,其中Action0,1,2…,0,1,2…代表call()方法能接收的参数个数,接下来我们把观察者和被观察者联系起来:

//订阅
switch.subscribe(light);//大功告成

但是刚开始的时候就是不理解为什么是被观察者订阅观察者,这是搞事情呢!到底谁观察着谁啊,别急有话好好说,询问了度娘之后才理解为什么这样写,按理说台灯观察开关从而开关,没毛病,应该是:light.subscribe(switch);才对啊,之所以开关订阅台灯是为了保证流失api的调用风格,那什么优势流式API的调用风格呢?

//这就是流式API调用风格
Oservable.just("on","off","on")//被观察者产生事件
          .filter(new Fun1(String,Boolean){
  
  //将事件进行过滤
                        @override
                        public Boolean call(String s){
                        return s! = null;
                        }
              })
           .subscribe(mSubscriber); //将过滤后的事件订阅给观察者是不是感觉看起来很流畅啊 

操作符(Operators)

 Observable.just("ON","OFF","ON")
                .map(new Func1<String, Object>() {
                    @Override
                    public Object call(String s) {
                        if(s.contentEquals("F")){
                            return "false";
                        }else {
                            return true;
                        }
                    }
                }).subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object o) {
                        Log.e(TAG, "call: "+o.toString() ;
                    }
                });

利用map操作符将被观察者传递的行为进行过滤,将字符串中含有F返回false,不含的返回true,而对于map的参数中第一个为被观察者传递的对象第二个为转换过滤后的对象,通过上面的代码也可以清楚地表现出流式API的调用
下面我们来看一下rxjava中如何异步处理:
在rxjava中有一个Scheduler —调度器,相当于线程控制器用来控制当前代码执行在哪个线程中,目前rxjava中内置了三种Scheduler:

  • Schedulers.immedate()表明直接运行在当前线程,不指定默认为该值;
  • 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()表明事件发生在主线程中。
    有了以上几种线程调度器,就可以使用subscribeOn()和observerOn()来对线程进行控制了,subscribeOn():指定subscribe()发生的线程,即Observable.onSubscribe()被激活的线程(事件产生),observableOn():指定Subscriber执行的线程,即事件消费的线程;光说不练假把式:
Observable.just("1","2","3")
                        .subscribeOn(Schedulers.io())//指定subscribe()执行的线程为io线程
                        .observeOn(AndroidSchedulers.mainThread())//指定Subscriber回调执行线程为主线程
                        .map(new Func1<String, Integer>(){
                            @Override
                            public Integer call(String s) {
                                return Integer.valueOf(s);
                            }
                        }).subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {
                        Log.d(TAG, "onCompleted: ");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError: ");
                    }

                    @Override
                    public void onNext(Integer integer) {
                        tv_age.setText(integer+"");
                        Log.d(TAG, "onNext: "+integer);
                    }
                });

以上代码编写在Androidstudio中,必须添加依赖库:
compile ‘io.reactivex:rxjava:1.0.9’
compile ‘io.reactivex:rxandroid:1.1.0’

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200735.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 支付宝功能结构图_阿里双十一晚会

    支付宝功能结构图_阿里双十一晚会转自:https://blog.csdn.net/itfly8/article/details/111027014简介:汤波(甘盘),男,1989/02/21,硕士学历。高中开始编程,热爱技术,深信技术让世界更美好。对前沿技术一直保持饥饿感,热衷于创新和革新,让系统体制更为高效和人性化,也深知一个人强走的快,一个团体强才能走的远。在技术团队建设(团队招聘和组建、梯队梯度建设)、技术栈管理(包含技术选型、技术规范建设、软件体系规划)和项目研发管理(软件工程管理、开发效能和质量管理)方面有着较为丰富的实..

    2022年10月19日
    3
  • fleck 客户端_用 Fleck 实现 websocket 通信[通俗易懂]

    fleck 客户端_用 Fleck 实现 websocket 通信[通俗易懂]usingDevExpress.XtraBars.Ribbon;usingFleck;usingIMS.DBHelper;usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Linq;usingSystem.Windows.Forms;usingWHC.Framework.Commons;usingRfi…

    2025年7月16日
    4
  • Ant下载及配置安装

    Ant下载及配置安装Ant下载及配置安装

    2022年7月13日
    15
  • 常见视频编码格式解析[通俗易懂]

    常见视频编码格式解析[通俗易懂]常见视频编码格式解析常见视频编码格式解析1.MPEG2-TS编码技术1.1.MPEG-TS简介1.2.基本概念及TS流概述1.3.基本流程1.4.TS流传输包(简称TS包)结构分析1.4.1.TS包包头1.4.2.TS包净荷部分1.5.PS节目流2.MPEG-4编码技术2.1.MPEG-4概述2.2.MPEG-4各部分2.3.MPEG-4层次结构3.H…

    2022年9月2日
    4
  • matlab循环读取txt文件「建议收藏」

    matlab循环读取txt文件「建议收藏」一般情况下,假如我要读取一个名为a.txt的文件,只需要利用下面的语句:a=load(‘a.txt’);现在假如我需要循环读取saif_1.txt,saif_2.txt,,,一直到saif_10.txt,他们都是10*1的矩阵,对他们进行转置操作后,再合并到一个文件中,可以利用下面的语句:forN=1:10a=load([‘saif_’,num2str(N),’.txt’]);……

    2022年10月7日
    4
  • D3人物关系图谱「建议收藏」

    D3人物关系图谱「建议收藏」本人其他博客有介绍

    2022年6月26日
    98

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号