RxJava

RxJava笔记 我们介绍RxJava中的线程切换主要是通过subscribeOn和observeOn操作符展开,对于线程切换Android中主要是子线程与主线程,在我们使用RxJava时会同步引入RXAndroid的包,为什么要同步引入RxAndroid的包呢,主要还是互相补充的原因,因为RxAndroid的包中包含的是Android特性的一些功能实现。RxJAVA也就完成了80%的内容,RxAndroid来补充了剩余的20%的实现。// 依赖RxAndroid 2X 的依赖库// 增加RxJava 2X 的依赖库。 阅读详情

RxJava

RxJava是啥?呵呵!?
关键是事件变换,线程调度,响应式编程
而怎么实现这些呢:最关键的就是接口泛型!
实现这些有什么用呢?

基本概念

Observable: 被观察者
OnSubscrible: 观察者
Operator: 观察者
Subscriber: 订阅者->其实也是一个观察者

首先我们要搞懂这三者之间的关系,
其实很简单
这里写图片描述

Action: Call方法无返回值
Func: Call方法有返回值
这里写图片描述

这是基本的对象概念。
这样子看其实也挺抽象的,怎样才能真正理解呢?
其实他们是有引入泛型的
然而+上泛型以后就复杂多了
接下来我们看看+上泛型的关系图
这里写图片描述

具体化 举个栗子

上面说的太抽象了–>接下来具体化一下来深入理解这里的概念
Observable: 被观察者
抽象的
OnSubscrible: 观察者–>产品T
Operator< T, R> : 观察者–>项目组
Subscriber: 订阅者->其实也是一个观察者–>抽象的技术
Action–>void call(T t): 产品技能–>提需求
Func< T, R>–>R call(T t): 需求–>转化成–>功能
具体的
OnSubscribleImpl< T, R> implements OnSubscrible 技术的老大
MapSubscriber< T , R> 具体的技术

事件变换

接下来,咋们就看看事件变换是啥玩意!
其实也就是把< T >跟< R >做交换!
这么6!?
那么是怎样把他们做交换的呢?
这时候我们就可以通过
实现 OnSubscrible: 与 Operator: 两个接口来实现!
当然这里面我们应该需要用到 Subscriber: 来帮助!

那么怎么搞法呢?!哈哈!

我们可以用心想想!
这里其实是比较难的,我就直接贴代码了!
怎么理解呢?
其实关键在于接口对象的使用。

/**
 * <b>Project:</b> ${file_name}<br>
 * <b>Create Date:</b> 2017/5/29<br>
 * <b>Author:</b> Tongson<br>
 * <b>Description:</b> ObservableDistinctUntilChanged  OnSubscrible对象交换者 供subscrible(Subscriber<? super T> subscriber)调用 <br>
 * <b>Description:</b>  技术的老大-->分派任务 <br>
 */
public class OnSubscribleImpl<T, R> implements OnSubscrible<R> {

    /**
     * 产品
     */
    OnSubscrible<T> onSubscrible;

    /**
     * 交换操纵者 -->需求换成-->具体的功能
     * extends   返回类型的限定
     * super     参数类型的限定
     * T  需求
     * R 功能
     */
    Operator<? extends R, ? super T> operator;

    public OnSubscribleImpl(OnSubscrible<T> onSubscrible, Operator<? extends R, ? super T> operator) {
        this.onSubscrible = onSubscrible;
        this.operator = operator;
    }

    /**
     * 外部调用
     * 让交换操纵者 返回Subscriber<? super T> tSubscriber
     * 老大  让产品提需求给技术去做功能(分派任务)
     *
     * @param subscriber
     */
    @Override
    public void call(Subscriber<? super R> subscriber) {
        /**
         *  operator  项目组
         *  tSubscriber  技术
         */
        Subscriber<? super T> tSubscriber = operator.call(subscriber);
        /**
         * 老大 直接把产品分派给技术(分派任务)
         */
        onSubscrible.call(tSubscriber);
    }
}
/**
 * <b>Project:</b> ${file_name}<br>
 * <b>Create Date:</b> 2017/5/27<br>
 * <b>Author:</b> Tongson<br>
 * <b>Description:</b> 方法交换操纵者 项目组 具体的观察者-->具体的项目组<br>
 * 项目组
 * T  需求
 * R  功能
 */
public class OperatorMap<T, R> implements Operator<R, T> {

    Func<? super T, ? extends R> transformer;

    public OperatorMap(Func<? super T, ? extends R> transformer) {
        this.transformer = transformer;
    }

    @Override
    public Subscriber<? super T> call(Subscriber<? super R> subscriber) {
        /**
         * 返回 Subscriber<? super T> 对象
         */
        return new MapSubscriber<>(subscriber, transformer);
    }

    /**
     * 具体的技术
     *
     * @param <T>
     * @param <R>
     */
    private class MapSubscriber<T, R> extends Subscriber<T> {

        private Subscriber<? super R> actual;

        private Func<? super T, ? extends R> mapper;

        public MapSubscriber(Subscriber<? super R> actual, Func<? super T, ? extends R> mapper) {
            this.actual = actual;
            this.mapper = mapper;
        }


        @Override
        public void onNext(T t) {
            /**
             * Map中call方法的调用
             */
            R r = mapper.call(t);
            /**
             * Subscriber<? super R> 对象中的方法的调用  技术-->做功能
             */
            actual.onNext(r);
        }
    }
}

线程调度

然后我们就来看看
线程是怎样去控制的?!
其实也不是很难(比起上面的事件变换容易)

主要是通过继承OnSubscrible中也就是OnSubscrible的儿子提供的线程控制的方法
Schedulers

在call方法中我们用 Observable: subscrible()->调起订阅的时候在里面把这方法转成想要的线程就可以了!

                /**
                 * String  类型  代表需求
                 * Bitmap  代表 功能
                 * new OnSubscrible  产品
                 */
                Observable.create(new OnSubscrible<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        spannableStringBuilder.append("Observable -->Subscriber call:1" + "\n" + "currentThread:" + Thread.currentThread().getName() + "\n");

                        subscriber.onNext("http://www.baidu.com");
                        spannableStringBuilder.append("Observable -->Subscriber call:5" + "\n" + "currentThread:" + Thread.currentThread().getName() + "\n");
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                resultTv.setText(spannableStringBuilder);
                            }
                        });
                    }
                }).subscribleOnIO().map(new Func<String, Bitmap>() {
                    //具体的转换类型角色
                    //老大让产品提需求给技术去做功能
                    @Override
                    public Bitmap call(String s) {
                        spannableStringBuilder.append("map-->OnSubscribleImpl call:" + "s:" + s + "\n");
                        spannableStringBuilder.append("currentThread:" + Thread.currentThread().getName() + "\n");
                        Bitmap bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.mipmap.ic_launcher);
                        return bitmap;
                    }
                }).subscrible(new Subscriber<Bitmap>() {
                    @Override
                    public void onNext(Bitmap bitmap) {
                        spannableStringBuilder.append("Subscriber onNext -->" + "\n" + "currentThread:" + Thread.currentThread().getName() + "\n");
                    }
                });

这里写图片描述

被观察者 Observable

/**
 * <b>Project:</b> ${file_name}<br>
 * <b>Create Date:</b> 2017/5/27<br>
 * <b>Author:</b> Tongson<br>
 * <b>Description:</b> 被观察者 <br>
 */
public class Observable<T> {

    /**
     * 接口 回调
     */
    private OnSubscrible<T> onSubscrible;

    /**
     * 构造器
     *
     * @param onSubscrible
     */
    private Observable(OnSubscrible<T> onSubscrible) {
        this.onSubscrible = onSubscrible;
    }


    /**
     * 开始
     *
     * @param onSubscrible
     * @param <T>
     * @return
     */
    public static <T> Observable<T> create(OnSubscrible<T> onSubscrible) {
        return new Observable<>(onSubscrible);
    }


    /**
     * 订阅
     *
     * @param subscriber
     */
    public void subscrible(Subscriber<? super T> subscriber) {
        onSubscrible.call(subscriber);
    }

    /**
     * 实例化 项目组
     * 实例化 交换者
     *
     * @param func
     * @param <R>
     * @return
     */
    public <R> Observable<R> map(Func<? super T, ? extends R> func) {
        return lift(new OperatorMap<>(func));
    }

    /**
     * 实例化 老大
     * 实例化 对象交换者
     *
     * @param trOperatorMap
     * @param <R>
     * @return
     */
    public <R> Observable<R> lift(OperatorMap<T, R> trOperatorMap) {
        return new Observable<>(new OnSubscribleImpl<>(onSubscrible, trOperatorMap));
    }

    public Observable<T> subscribleOnIO() {
        return create(new OnSubscribleOnIO<T>(this));
    }

    public Observable<T> subscribleMain() {
        return create(new OnSubscrbleMain<T>(new Handler(Looper.getMainLooper()), this));
    }

}

这个被观察者贯穿所有的存在!

首先

create

订阅

subscrible
map
lift

线程

subscribleOnIO
subscribleMain

return

Observable
这里的方法都是返回Observable为了可以继续调用下去吧

响应式编程

                /**
                 * 响应式编程
                 */
                spannableStringBuilder.append("btn_2-------------------\n");
                Observable.create(new OnSubscrible<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        spannableStringBuilder.append("Observable -->Subscriber call:1" + "\n" + "currentThread:" + Thread.currentThread().getName() + "\n");
                        subscriber.onNext("http://www.baidu.com");
                        spannableStringBuilder.append("Observable -->Subscriber call:5" + "\n" + "currentThread:" + Thread.currentThread().getName() + "\n");
                    }
                }).map(new Func<String, Bitmap>() {
                    //具体的转换类型角色
                    @Override
                    public Bitmap call(String s) {
                        spannableStringBuilder.append("map-->OnSubscribleImpl call:" + "s:" + s + "\n");
                        spannableStringBuilder.append("currentThread:" + Thread.currentThread().getName() + "\n");
                        Bitmap bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.mipmap.ic_launcher);
                        return bitmap;
                    }
                }).subscrible(new Subscriber<Bitmap>() {
                    @Override
                    public void onNext(Bitmap bitmap) {
                        spannableStringBuilder.append("Subscriber onNext -->" + "\n" + "currentThread:" + Thread.currentThread().getName() + "\n");
                    }
                });
                spannableStringBuilder.append("btn_2-------------------\n\n");
                resultTv.setText(spannableStringBuilder);

这里写图片描述

手写RxJavaDemo

https://github.com/gepriniusce/TongsonPlay/tree/rxjava

RxJava2用法Demo

https://github.com/amitshekhariitbhu/RxJava2-Android-Samples

RxJava的思想很值得学习
而RxJava框架也是很好,对于复杂逻辑的代码我们可以直接用Rx这样子就算换一个同事来看这代码也比较清晰。

LMK04821时钟芯片SPI配置避坑指南:从寄存器读写到频率校准全流程 本文详细解析了LMK04821时钟芯片的SPI配置全流程,涵盖寄存器读写、频率校准及JESD204B系统设计中的关键技巧。通过实战案例和避坑指南,帮助工程师高效解决时钟输出异常、同步失败等常见问题,提升高速数据采集系统的时钟稳定性。 阅读详情

相关推荐

Unity 2022.3.3 LTS + Visual Studio 2022:手把手教你复刻《吸血鬼幸存者》核心战斗(附完整项目源码)

本文详细介绍了如何使用Unity 2022.3.3 LTS和Visual Studio 2022从零构建《吸血鬼幸存者》式战斗系统。通过图文开发教程,涵盖对象池优化、ECS架构雏形、2D物理碰撞控制等关键技术,帮助开发者高效复刻这款热门游戏的自动攻击与海量刷怪机制。

weixin_30721077的博客 459

Rxjava2.0基础使用步骤

Rxjava是一个基于时间流的链式调用,也是一种以观察者模式实现的框架 用于异步实现,类似AsyncTask,handler Rxjava有几种实现方式,看项目情况使用 使用依赖 compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 基础实现方式-分步实现 1.创建被观察者 Observable<Integer> = Observable .cr

weixin_41422638的博客 287

【新华三】DHCP+TFTP+ZTP自动开局实战

设备运行ZTP功能,可以自动获取并自动加载开局文件,实现设备的免现场配置和部署,从而降低人力成本,提升部署效率。使用TFTP服务器工具进行文件的上传和下载,网上很多TFTP server软件,大家可以自行下载。3CDaemon等,可以根据使用自取所需。大家应该都了解ZTP,但是目前发现除了控制器之外仅使用ZTP开局的兄弟并不是很多,因此分享此过程方便大家批量开局,留出更多时间学习更多技术。电脑打开DHCP服务器,TFTP服务器,并通过网线连接到设备的管理口,若设备较多可以通过带外交换机等进行连接,

五大连池的镜子 4983

Rxjava使用手册

创建Observables https://github.com/ReactiveX/RxJava/wiki/Creating-Observables#create 1:Observable.fromAction使用效果: Observable<Integer> observable = Observable.fromAction( () ->...

sometime here 302

别再乱点U盘里的.exe了!手把手教你彻底清除那个伪装成Usb Disk的蠕虫病毒

本文详细介绍了如何识别、清除和预防伪装成Usb Disk的蠕虫病毒。从识别感染迹象到安全备份文件,再到深度清理病毒残留和构建防护策略,提供了一套完整的U盘病毒解决方案。特别提醒用户注意U盘病毒的风险,并养成良好的使用习惯。

weixin_30496999的博客 675

Tessent --- PDL

当关联的ICL模块是当前ICL顶部模块时,即当它与当前设计匹配时,只能iCall一个iTopProc。但是,可以在iTopProc内调用iCall iProc或iTopProc。为指定后续iProc命令引用的ICL模块,发出这个命令之后,随后定义的iProc都会对应的ICL模块进行定义。为后续iCall调用,当使用iCall命令调用该过程时,参数列表中的变量将被替换为iCall命令中指定的值。在调用iProc时,运行iProc内的命令。PDL是面向工程师的,工程师利用PDL语言,对ICL中的单元进行控制。

qiantianyiqian的博客 2791

RxJava理解系列(三)--subscribeOn

前面分析了RxJava中map()操作符的基本原理,今天,我们开始分析RxJava中subscribeOn()这个操作符(本篇基于RxJava2进行分析)

巨石强森小童鞋的博客 1077

LaTeX参考文献格式apsrev4-1,增加文献标题

APS的LaTeX参考文献格式apsrev4-1是隐藏标题的,如果想要出现标题,需要更改apsrev4-1.bst文件内容 在apsrev4-1.bst文件靠后部分,定义不同类型文献格式的地方,将article类型的内容替换为, FUNCTION {article} { output.bibitem format.authors booktitle empty$ { "author" output.check }{ output } if$ author format.

loading1234567的博客 5032

RxJava开发文档

我们的第一个Observable 在我们的第一个列子里,我们将检索安装的应用列表并填充RecycleView的item来展示它们。我们也设想一个下拉刷新的功能和一个进度条来告知用户当前任务正在执行。 首先,我们创建Observable。我们需要一个函数来检索安装的应用程序列表并把它提供给我们的观察者。我们一个接一个的发射这些应用程序数据,将它们分组到一个单独的列表中,以此来展示响应式方

wolfking0608的博客 640

《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求)

8项需求工程任务 inception 开始 8.1.1 identify stakeholders 定义:从软件开发中收益 例如:市场人员、销售经理、顾客、顾问、维护团队等(P139) 8.1.2 这个阶段的问题是context-free的。有三套(P140) 8.1.3 提到NFR(nonfunctional requirement)和QFD(quality

whooiif的博客 1815

从零开始:ENSP与VirtualBox的兼容性迷宫与突围指南

本文深入解析eNSP与VirtualBox的兼容性问题,特别是报错40的解决方案。从诊断根源、彻底卸载残留到推荐黄金版本组合,提供了一套完整的实战指南,帮助网络工程师和技术学习者快速解决AR_Base等设备的启动故障,优化虚拟化环境性能。

weixin_29284885的博客 478

RxJava详解

1. Schedulers.io(): I/O 操作(读写文件、数据库、网络请求等),与newThread()差不多,区别在于io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 效率比 newThread() 更高。传统的嵌套请求,一般都是在前一个请求的 onSuccess() 回调里面发起新的请求,这样一旦嵌套多个的话,缩进就是大问题了,而且严重的影响代码的可读性。为什么需要返回值呢?不难发现,上述的 map 操作符,是一对一的变换,并且返回的是变换后的对象。

weixin_40387773的博客 4703

【MATLAB代码】基于水声通信(ACOMMS)下的到达时间差(TDOA)定位的AUV自主导航例程,附完整代码

水下AUV导航系统仿真研究 本研究基于到达时间差(TDOA)技术实现了水下自主航行器(AUV)的三维导航仿真系统。系统采用四个声学信标作为定位基准,通过TDOA测量数据迭代求解AUV位置。仿真结果表明: 导航性能:系统能够有效跟踪AUV从起点(30,30,-20)到目标点(70,70,-20)的航行轨迹,定位误差保持在合理范围内。 误差分析:定位误差变化曲线显示系统具有稳定的定位精度,平均误差为0.5米左右。 技术特点:采用两步最小二乘迭代算法求解非线性TDOA方程,提高了定位精度和计算效率。 该仿真系统为

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 321

Android之Rxjava2.X 1————Rxjava概述

Android之Rxjava2.X 1————Rxjava概述 一.目录 Android之Rxjava2.X 1————Rxjava概述 一.目录 二.前言 三.Rx的概述 1.Rx介绍 2.Rx的特点 四.函数响应式编程 1.响应式编程 2.函数响应式编程 五.Rxjava的原理 1.扩展的观察者模式 2.Rxjava的观察者模式流程 六.Rxjava的基本使用 1. 分步...

冰炭不投day的博客 1426

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android面试神器之Rxjava破冰

前言 刚参加工作的时候接触到了项目中的Rxjava,当时一点基础没有,学习了好长时间才渐渐学会使用,但也只是皮毛,停留在表面。后来换工作了发现Rxjava对找工作的帮助还是挺大的,因为是流行框架,都可以讲给面试官听,体现出自己追求技术的精神。但实际上,学会Rxjava对技术的提升还是很有帮助的,所以我会为大家讲解Rxjava的相关知识,以及Rxjava 1 到Rxjava 2的变化,帮助大...

风花散却隽世间,雪月寥落化雨田 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RXJAVA从入门到精通

一文帮你读懂rxjava

qq_50709355的博客 4680

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Android开源框架面试题】 RxJava框架线程切换的原理,RxJava1与RxJava2有哪些区别?

我整理了一套Android面试题合集,除了以上面试题,还包含【Java 基础、集合、多线程、虚拟机、反射、泛型、并发编程、Android四大组件、异步任务和消息机制、UI绘制、性能调优、SDN、第三方框架、设计模式、Kotlin、计算机网络、系统启动流程、Dart、Flutter、算法和数据结构、NDK、H.264、H.265.音频编解码、FFmpeg、OpenMax、OpenCV、OpenGL ES。

datian1234的博客 1412

Android RxJava:这是一份RxJava使用入门学习指南

即 开厨房 - 确定对应菜式Next事件、Complete事件 &Error事件。具体如下:具体实现// 1. 创建观察者 (Observer )对象// 2. 创建对象时通过对应复写对应事件方法 从而 响应对应事件// 观察者接收事件前,默认最先调用复写 onSubscribe()@OverrideLog.d(TAG, “开始采用subscribe连接”);

2401_84009192的博客 1457

RxJava在Android中内存泄漏解决以及RxJava的封装。

RxJava在现在是一个非常前卫的异步框架,也是由于他非常新,所以比较难以驾驭。 像okhttp直接在onStop或者onDestroy 调用它的cancel方法就行了,但是Rxjava并没有那么简单。因为假如每次请求都得到Observable对象,然后再onStop中unsubscribe取消,这样很不利于封装。而且会造成代码量很多,所以我找到了用rxlifecycle的解决方案。 先导包

adzcsx2的博客 6799

RxJAVA

在介绍RxJava前,我们先聊聊响应式编程。那么什么是响应式编程呢?响应式编程是一种基于异步数据 流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一 条流合并为一条新的流。响应式编程的一个关键概念是事件。事件可以被等待,可以触发过程,也可以触发其它事件。事件是唯 一的以合适的方式将我们的现实世界映射到我们的软件中:如果屋里太热了我们就打开一扇窗户。同样 的,当我们的天气app从服务端获取到新的天气数据后,我们需要更新app上展示天气信息的UI;...

weixin_53431933的博客 1102

RxJava初探

RxJava

qq_43653111的博客 2641

rxjava背压

没错,没给你闹着玩,他真的又抛出大家喜欢的异常了,没毛病。不知道,大家看完了RxJava1.0的背压,对它有什么看法?下面是我对RxJava1.0背压的一些理解。

2401_84121998的博客 916

Rxjava

RxJava是基于观察者模式设计的,它提供了一种响应式编程的思维方式,使得异步编程更加灵活和高效。链式操作避免了多层嵌套,使代码更加清晰简

1082

RxJava 1 到RxJava2

RxJava2 目前已经在国外一些应用使用上,国内应用也有部分用于生产环境,是时候考虑切换到RxJava2。RxJava2主要是解决了Backpressure, 设计符合Reactive-Streams规范,以及其它一些更新。RxJava 1.X升级RxJava 2.X部分变更 描述 RxJava 1.X RxJava 2.X package包名 rx.xxx io.react

小小程序员 1668

Rxjava学习总结

RxJava 中的一些基本概念包括:Observable(被观察者)Observable 是一个数据流的源头,它可以发出三种类型的事件:发射数据(OnNext),发射一个错误(OnError),或者发射完成(OnComplete)。Observer(观察者)Observer 是消费 Observable 产生的数据流的实体。它有三个方法对应 Observable 的三种事件类型:onNext,onError 和 onComplete。

shinecjj的博客 1005

RxJava 完全解析 是时候来进阶 RxJava 了!

什么是RxJava? RxJava用于反应式编程。在反应式编程中,消费者在数据进入时作出反应。反应式编程允许事件更改传播给已注册的观察者。 我们知道RxJava是Android项目最重要的库。因此,我们必须正确掌握在Android项目中使用RxJava。 而且我相信: RxJava是一门艺术,无穷无尽的可能性等待着能够掌握它的人。 让我们看看所有可用于以最佳方式学习RxJav...

圆号本号 835
上一篇: GitHub上Daily项目的个人分析
下一篇: 走进Java Android 的线程世界
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值