java造轮子_RxJava 自己造轮子一

article/2025/10/16 18:41:01

RXJava 造轮子

什么是rxjava?

rxjava 是一个响应式编程,为了更好更优雅的处理异步时间,内部实现原理是观察者模式

自己造轮子实现Rxjava

观察者模式核心有两个,一个观察者一个被观察者

先创建一个被观察者observer(基层抽象类)

//观察者的基层抽象类

public interface Observer {

void onNext(T value);

void onError(Throwable throwable);

void onComplete();

}

观察者内部实现了三个方法,完成,错误,下一步

创建一个observable(观察者)

//被观察者

public class Observable{

OnSubscrib onSubscrib;

//私有构造

private Observable(OnSubscribonSubscrib){

this.onSubscrib=onSubscrib;

}

//创造被观察者对象

public static Observable create(OnSubscribonSubscrib){

return new Observable(onSubscrib);

}

//开始观察,观察者和被观察者建议联系

public void subscrib(Subscriber subscriber){

subscriber.start();

//被观察者拿到观察者对象

onSubscrib.call(subscriber);

}

}

观察者的构造函数中传入了一个onSubscrib对象

onsubscrib实际就是观察者发生(发起通知)实现的对象

onsubscrib 中的call()方法,就是建立观察者和被观察者之间关系的桥梁

onSubscrib类如下

public interface OnSubscrib{

void call(Subscriber subscriber);

}

例子实现

总体流程是这样的:

1. 创建一个被观察者对象observable,传入了一个onsubscrib对象,用来设置通知发生的时机

2. 创建一个观察者subscriber,依次实现抽象方法

3. 通过被观察者observable调用subscrib(),传入了subscriber

- 其实是observable中的onsubscrib拿到了subscriber

- 拿到subscriber之后,根据出发条件通知观察者

4. subscriber被调用抽象方法,观察者被通知了

添加map操作符

添加map操作符原理其实是这样的:

观察者模式先创建了observable对象,传入了onsubscrib对象

调用map操作符,生成了一对新的观察者和被观察者的observable 和subscriber

生成的subscriber 直接观察上层的observable

这样通知流程就完成了

如下图:

map%E6%93%8D%E4%BD%9C%E7%AC%A6.jpeg?raw=true

map操作符

线程切换实现

1.Worker是实现代码的runnable,会在指定的线程中工作

例如,代码中是一个单线程工作

public class Worker {

Executor executor;

public Worker(Executor executor){

this.executor=executor;

}

//执行操作

public void schedule(Runnable runnable){

executor.execute(runnable);

}

}

Scheduler 提供了生成Worker的方法

定义一个Schedule作为scheduler的工厂类,内部提供了各种线程,以供在worker中使用

具体实现

定义一个subscribOn()指定被观察者的工作线程

public Observable subscribOn(final Scheduler scheduler){

return Observable.create(new OnSubscrib() {

@Override

public void call(final Subscriber subscriber) {

//将线程发送的操作用在具体的线程中

scheduler.createWorker().schedule(new Runnable() {

@Override

public void run() {

//订阅上层观察者

Observable.this.subscrib(subscriber);

}

});

}

});

}

内部实现和map操作符类似

生成一个新的observeble和subscriber

监听上层observable,并且将onsubscrib.call()方法出发通知放在设置的线程中发送通知

定义一个observeOn()指定观察者的线程

public Observable observeOn(final Scheduler scheduler){

//需要将subscriber中的方法放置在对应线程中处理

return Observable.create(new OnSubscrib() {

@Override

public void call(final Subscriber subscriber) {

final Worker worker=scheduler.createWorker();

Observable.this.subscrib(new Subscriber() {

@Override

public void onNext(final T value) {

//下一步执行在指定线程中

worker.schedule(new Runnable() {

@Override

public void run() {

subscriber.onNext(value);

}

});

}

@Override

public void onError(Throwable throwable) {

subscriber.onError(throwable);

}

@Override

public void onComplete() {

subscriber.onComplete();

}

});

}

});

}

原理和上面一样

生成一个新的observeble和subscriber

监听上层observable,生成新的subscriber

在subscriber中,将next()方法在指定的线程中运行

测试例子

Observable.create(new OnSubscrib() {

@Override

public void call(Subscriber subscriber) {

Log.e(TAGObservable, Thread.currentThread().getName());

subscriber.onNext("1");

}

})

.subscribOn(Schedulers.io())

.observeOn(Schedulers.io())

.subscrib(new Subscriber() {

@Override

public void onNext(String value) {

Log.e(TAGSubscriber, value);

Log.e(TAGSubscriber, Thread.currentThread().getName());

}

@Override

public void onError(Throwable throwable) {

}

@Override

public void onComplete() {

}

});

线程调度流程如下图:

69bf86e891d4

线程调度.jpeg

rxJava简单的轮子实现就先告一段落了,下面开始各种操作符的使用体验了啊

github传送门


http://chatgpt.dhexx.cn/article/DeSchxnJ.shtml

相关文章

react hook 造轮子

GitHub地址:https://github.com/rayhomie/rayhomieUI 一、sass的使用 1、import方式引入scss文件,后面必须带后缀名scss import "main.scss";2、Partials方式引入base.scss文件,文件必须以(下划线)开头,可以不用带后…

「轮子工厂」谭庆波,很高兴认识大家!

我是谁: 我叫谭庆波,网名厂长。 首先我是一名学生,哈工大计算系的博士生,也是一个喜欢在互联网上折腾的95后。 2015年开始写博客,累计输出博客500多篇,访问量超百万; 2018年开始做公众号和知乎&…

前端轮子厂

1. Element Element-Ul是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库,手机端有对应框架是Mint UI 。 中文文档:http://element-cn.eleme.io/#/zh-CN github地址…

前端_Vue_1.初识Vue

文章目录 一、前言二、开始1 简介1.1 什么是Vue?1.2 渐进式框架1.3 单文件组件1.4. API风格1.4.1. 选项式API(Options API)1.4.2. 组合式API(Composition API)1.4.3. 该选哪个? 2. 快速上手(学前…

Nginx-学习一

什么是Nginx Nginx是一个http服务器。 是一个使用c语言开发的高性能的http服务器及反向代理服务器。 Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试ngin…

Nginx学习二

文章目录 一、proxy_set_header1.1、<span class"katex--inline">http\_host与</span>host区别1、在使用Nginx做反向代理的时候&#xff0c;proxy_set_header功能可以设置反向代理后的http header中的host&#xff0c;1.1.1、 不设置 proxy_set_header H…

nginx学习一

nginx 安装&#xff1a; 1、 ./configure 如果报错 error: C compiler cc is not found 如果没有安装就安装:yum install –y gcc 如果还报错看看是不是安装: yum install –y zlib zlib-devel 2、 安装 make 3、 make install 4、 安装完后可以查看到目录 5、 启动 nginx …

nginx学习记录

一、docker安装nginx和配置文件 &#xff08;1&#xff09;docker拉取镜像 docker pull nginx &#xff08;2&#xff09;创建容器 # 在/root⽬录下创建nginx⽬录⽤于存储nginx数据信息 mkdir ~/nginx cd ~/nginx mkdir conf cd conf # 在~/nginx/conf/下创建nginx.conf⽂件…

尚硅谷nginx学习笔记

尚硅谷nginx学习笔记 1.nginx相关概念1.1什么是nginx&#xff1f;1.2正向和反向代理1.3负载均衡1.4动静分离 2.nginx在linux中的安装与启动3.nginx的常用命令4.nginx的配置文件5.nginx配置实例5.1反向代理准备工作5.2反向代理实例一5.3反向代理实例二5.4负载均衡实例5.5动静分离…

Nginx学习(一)

系统版本CentOS Linux release 7.6.1810 (Core) Nginx作用 反向代理正向代理负载均衡HTTP服务器(包含动静分离) 环境确认 1.关闭iptables规则 如果启动的iptables防火墙不想关闭的话&#xff0c;可以通过iptables -F 来清除防火墙关闭。然后通过iptables -L查看 2.停用seli…

NGINX学习记录-基础入门篇

学习《NGINX 经典教程》林静&#xff0c;刘旭峰&#xff0c;章澍&#xff0c;廖健雄&#xff0c;宗兆伟 ... 著 目录 一、Nginx优点 二、功能(应用场景) 反向代理。 负载均衡 静态缓存 Web服务器 安全和访问控制 三、nginx安装 四、启动、停止和重载nginx 五、配置文…

Nginx学习总结(1):Nginx简介

(最近&#xff0c;部门组织了好几个技术兴趣小组&#xff0c;对当前的热门技术进行研究。我加入了Nginx学习小组&#xff0c;与几个同事一道围绕Nginx来进行研究和学习。从今天起&#xff0c;我会陆陆续续发一系列有关Nginx的学习总结。本文是系列之一&#xff1a;Nginx简介。)…

学习nginx

Nginx笔记 安装nginxwget -c https://nginx.org/download/nginx-1.20.1.tar.gz1、创建软链路ls /usr/local/nginx/sbin/nginx /usr/bin/ 2、前端部署配置 Conf 在这里插入图片描述 3、启动服务 由于软链路 可以直接 nginx 启动&#xff08;任意目录&#xff09; 停止 nginx -s…

nginx学习日记

nginx介绍 1.什么是nginx? nginx就是c语言开发的一个高性能HTTP和反向代理Web服务器以及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器 nginx是轻量级的。 2.什么是反向代理&#xff1f; 代理服务可以简单的分为正向代理和反向代理。 正向代理&#xff1a;就是代理…

Nginx学习笔记总结:初次认识 Nginx

2022 年 4月 16 日 百思不得小赵 &#x1f50d;点此进入博客主页 —— 新时代的农民工 &#x1f64a; —— 换一种思维逻辑去看待这个世界 &#x1f440; 今天是加入CSDN的第1141天。觉得有帮助麻烦&#x1f44f;点赞、&#x1f340;评论、❤️收藏啦。 概述 Nginx是一个高性能…

Nginx服务器学习

学习思维导图 Nginx服务架构说明 Nginx采用master-worker的架构&#xff0c;和tomacat的按路径匹配一个节点线程进行处理方式不同&#xff0c;Nginx是直接让worker来先抢夺资源也就是请求&#xff0c;然后在去处理&#xff0c;每个worker保持为一个独立的进程。 Nginx服务的实际…

nginx学习,看这一篇就够了

nginx学习&#xff0c;看这一篇就够了&#xff1a;下载、安装。使用&#xff1a;正向代理、反向代理、负载均衡。常用命令和配置文件,很全_冯安晨-CSDN博客_nginx 代理 文件下载文章目录前言一、nginx简介1. 什么是 nginx 和可以做什么事情2.Nginx 作为 web 服务器3. 正向代理4…

Nginx学习+安装

目录 一、Nginx介绍 二、Nginx下载和安装 1.安装过程 三、了解目录结构 小知识点&#xff1a;树形结构目录展示 四、常用命令 五、配置文件结构 六、具体应用 1.部署静态资源 2.反向代理 了解正向代理 反向代理 3.负载均衡 重中之重&#xff1a;更详细的内容可以访…

Nginx学习与安装

Nginx学习与安装 一、Nginx介绍二、Nginx 安装2.1 安装 pcre-8.44.tar.gz2.2 安装openssl与zlib2.3 安装nginx2.4 Nginx 命令 Nginx 配置文件 一、Nginx介绍 是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx以事件驱动的方式编写…

手把手学习nginx基本配置

相信很多人都听过nginx&#xff0c;这个小巧的东西慢慢地在吞食apache和IIS的份额。那究竟它有什么作用呢&#xff1f;可能很多人未必了解。 说到反向代理&#xff0c;可能很多人都听说&#xff0c;但具体什么是反向代理&#xff0c;很多人估计就不清楚了。摘一段百度百科上的描…