java造轮子_RxJava 自己造轮子一
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 自己造轮子一相关推荐
- 为什么又要造一个叫 Latke 的轮子
框架 使用框架的好处很多,它规范了我们的开发方式,减少了出错的可能性,让我们可以更快地完成开发目标,后续维护也可以有章可循:使用框架的弊端也很明显,它束缚了我们,离开熟悉的框架进行开发我们可能会手足无 ...
- 程序员该造轮子吗,造轮子能升职加薪吗?
持续坚持原创输出,点击蓝字关注我吧 作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!???? 目录 一.前言 二.我造过的轮子 1. RPC 通 ...
- java简单工厂模式实例造车,JAVA设计模式学习5——工厂方法模式
工厂方法模式(Factory Method)又称虚拟构造子模式,可以说是简单工厂的抽象,也可以理解为简单工厂是退化了的工厂方法模式,其表现在简单工厂丧失了工厂方法的多态性.我们前一节中提到当产品结构变 ...
- 吉利蔚来造手机,小米造车
吉利蔚来造手机,小米造车 北京时间2022年2月22日星期二,在网络上被认为是百年来最"2"的日子,又一家车企被爆出涉足手机业务,就是中国造车新势力领头羊的蔚来,招来了原美图手机总 ...
- 【转】用TrueType造字程序自己造字
用TrueType造字程序自己造字 经常进行文字编辑的朋友难免会碰到一些无法输入的怪字,这是因为这些字用得很少所以电脑字库中并没有这些字.此时用Windows的TrueType造 ...
- 在线教育退潮,教育硬件起浪:“老厂”造平板,“大厂”造台灯
来源|刺猬公社 文|园长 编辑|语境 随着监管制度日益完善.监管政策不断出台,在线教育行业在2021年的全面收缩已成定局:削减业务.裁撤员工.减少广告投放,持续蒙眼狂奔的教育赛道,犹如炭火突然被泼上了 ...
- 一个对JAVA不熟悉导致实现造轮子的悲惨故事
近期有个项目是要实现一个简单的垂直搜索引擎,在做爬虫这一块时,要分析页面上所有的URL.但有些URL采用的是相对链接地址形式. 如:http://blog.csdn.net/lizhihaoweiwe ...
- 自己造一个简易的IOC轮子
简易的IOC流程编写笔记 首先先对这个小demo做一个说明.首先这个demo是很简易的,里面有一些可以优化的复杂点我设置了TODO,如果你有兴趣的话,可以自己去完善一下,写这个demo就是为了让自己对 ...
- 3天造了一个深度学习轮子,生猛!
2020国内深度学习框架领域百花齐放.各大公司也都陆续推出了自己的框架,大大推动了深度学习的发展.深度学习俨然已经渗入到我们生活中的每个角落,给生活带来极大便利. 深度学习能够针对生产生活所面临的复杂 ...
最新文章
- (zt)Web 2.0奔路进行时
- 如何在C ++中从容器中删除元素
- will not add file alias already exists in index(git上传代码出错)
- 2018危机与机遇丨PMCAFF年度精选合集
- ASPxGridView1单击,双击事件
- JsRender 前端渲染模板常用API学习
- 当年年仅18岁韩寒舌战群儒,受尽冷嘲热讽!
- linux 分区个数限制,硬盘分区个数限制
- 【刘文彬】 Controller:EOS区块链核心控制器
- sql语句中用select语句查询值大于平均值的情况
- Winform 类似于WINDOWS的选择文件夹对话框
- macbook用户注意了,这个行为可能导致显示屏损坏
- led伏安特性实验误差分析_为什么非线性电阻元件伏安特性曲线的误差分析?
- 世界上最具价值的10家公司!
- 使用Bootstrap制作网页主界面、增加界面
- 使用css实现扫描效果
- 洛谷P1508Likecloud-吃、吃、吃 ----- Only my water can help me
- 中国天眼发现地外文明可疑信号,马斯克称星舰7月开始轨道试飞,网信办:APP不得强制要求用户同意处理个人信息,今日更多大新闻在此...
- 谷歌创始人拉里·佩奇和谢尔盖·布林发表了论文 The Pagerank Citation Rank :Bringing Order to the Web...
- 1个字节,2个字节,4个字节数据之间赋值
热门文章
- CCF-CSP 201412-1 门禁系统 C语言(满分通过代码+题解)
- 腾讯抛售新东方在线套现7 亿港元;抖音成2022年世界杯持权转播商|聚观早报
- 3dcnn视频分类算法-pytorch上分之路
- 数据库原理(十 二)- 逻辑结构设计
- spark sql保存hive表时的压缩设置
- spring boot基于Springboot的球鞋调货管理系统设计与实现 毕业设计-附源码160942
- 李佳琦直播连续翻车的原因大揭秘,网红背后推手MCN机构都在做什么?
- kali linux 简单介绍
- 关于“国家重点实验室应该追求什么”的讨论
- 爬楼梯——递推法(一维、多维、图)