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操作符

线程切换实现

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() {

}

});

线程调度流程如下图:

线程调度.jpeg

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

github传送门

java造轮子_RxJava 自己造轮子一相关推荐

  1. 为什么又要造一个叫 Latke 的轮子

    框架 使用框架的好处很多,它规范了我们的开发方式,减少了出错的可能性,让我们可以更快地完成开发目标,后续维护也可以有章可循:使用框架的弊端也很明显,它束缚了我们,离开熟悉的框架进行开发我们可能会手足无 ...

  2. 程序员该造轮子吗,造轮子能升职加薪吗?

    持续坚持原创输出,点击蓝字关注我吧 作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!???? 目录 一.前言 二.我造过的轮子 1. RPC 通 ...

  3. java简单工厂模式实例造车,JAVA设计模式学习5——工厂方法模式

    工厂方法模式(Factory Method)又称虚拟构造子模式,可以说是简单工厂的抽象,也可以理解为简单工厂是退化了的工厂方法模式,其表现在简单工厂丧失了工厂方法的多态性.我们前一节中提到当产品结构变 ...

  4. 吉利蔚来造手机,小米造车

    吉利蔚来造手机,小米造车 北京时间2022年2月22日星期二,在网络上被认为是百年来最"2"的日子,又一家车企被爆出涉足手机业务,就是中国造车新势力领头羊的蔚来,招来了原美图手机总 ...

  5. 【转】用TrueType造字程序自己造字

    用TrueType造字程序自己造字            经常进行文字编辑的朋友难免会碰到一些无法输入的怪字,这是因为这些字用得很少所以电脑字库中并没有这些字.此时用Windows的TrueType造 ...

  6. 在线教育退潮,教育硬件起浪:“老厂”造平板,“大厂”造台灯

    来源|刺猬公社 文|园长 编辑|语境 随着监管制度日益完善.监管政策不断出台,在线教育行业在2021年的全面收缩已成定局:削减业务.裁撤员工.减少广告投放,持续蒙眼狂奔的教育赛道,犹如炭火突然被泼上了 ...

  7. 一个对JAVA不熟悉导致实现造轮子的悲惨故事

    近期有个项目是要实现一个简单的垂直搜索引擎,在做爬虫这一块时,要分析页面上所有的URL.但有些URL采用的是相对链接地址形式. 如:http://blog.csdn.net/lizhihaoweiwe ...

  8. 自己造一个简易的IOC轮子

    简易的IOC流程编写笔记 首先先对这个小demo做一个说明.首先这个demo是很简易的,里面有一些可以优化的复杂点我设置了TODO,如果你有兴趣的话,可以自己去完善一下,写这个demo就是为了让自己对 ...

  9. 3天造了一个深度学习轮子,生猛!

    2020国内深度学习框架领域百花齐放.各大公司也都陆续推出了自己的框架,大大推动了深度学习的发展.深度学习俨然已经渗入到我们生活中的每个角落,给生活带来极大便利. 深度学习能够针对生产生活所面临的复杂 ...

最新文章

  1. (zt)Web 2.0奔路进行时
  2. 如何在C ++中从容器中删除元素
  3. will not add file alias already exists in index(git上传代码出错)
  4. 2018危机与机遇丨PMCAFF年度精选合集
  5. ASPxGridView1单击,双击事件
  6. JsRender 前端渲染模板常用API学习
  7. 当年年仅18岁韩寒舌战群儒,受尽冷嘲热讽!
  8. linux 分区个数限制,硬盘分区个数限制
  9. 【刘文彬】 Controller:EOS区块链核心控制器
  10. sql语句中用select语句查询值大于平均值的情况
  11. Winform 类似于WINDOWS的选择文件夹对话框
  12. macbook用户注意了,这个行为可能导致显示屏损坏
  13. led伏安特性实验误差分析_为什么非线性电阻元件伏安特性曲线的误差分析?
  14. 世界上最具价值的10家公司!
  15. 使用Bootstrap制作网页主界面、增加界面
  16. 使用css实现扫描效果
  17. 洛谷P1508Likecloud-吃、吃、吃 ----- Only my water can help me
  18. 中国天眼发现地外文明可疑信号,马斯克称星舰7月开始轨道试飞,网信办:APP不得强制要求用户同意处理个人信息,今日更多大新闻在此...
  19. 谷歌创始人拉里·佩奇和谢尔盖·布林发表了论文 The Pagerank Citation Rank :Bringing Order to the Web...
  20. 1个字节,2个字节,4个字节数据之间赋值

热门文章

  1. CCF-CSP 201412-1 门禁系统 C语言(满分通过代码+题解)
  2. 腾讯抛售新东方在线套现7 亿港元;抖音成2022年世界杯持权转播商|聚观早报
  3. 3dcnn视频分类算法-pytorch上分之路
  4. 数据库原理(十 二)- 逻辑结构设计
  5. spark sql保存hive表时的压缩设置
  6. spring boot基于Springboot的球鞋调货管理系统设计与实现 毕业设计-附源码160942
  7. 李佳琦直播连续翻车的原因大揭秘,网红背后推手MCN机构都在做什么?
  8. kali linux 简单介绍
  9. 关于“国家重点实验室应该追求什么”的讨论
  10. 爬楼梯——递推法(一维、多维、图)