}
@Override
public void onError(Throwable t) {
Log.w(TAG, "onError: ", t);
}
@Override
public void onComplete() {
Log.d(TAG, “onComplete”);
}
};
upstream.subscribe(downstream);
我们注意到这次和 Observable 有些不同. 首先是创建 Flowable 的时候增加了一个参数, 这个参数是用来选择背压,也就是出现上下游流速不均衡的时候应该怎么处理的办法, 这里我们直接用 BackpressureStrategy.ERROR
这种方式,这种方式会在出现上下游流速不均衡的时候直接抛出一个异常,这个异常就是著名的MissingBackpressureException
. 其余的策略后面再来讲解.
另外的一个区别是在下游的 onSubscribe
方法中传给我们的不再是 Disposable 了, 而是 Subscription
, 它俩有什么区别呢, 首先它们都是上下游中间的一个开关, 之前我们说调用 Disposable.dispose()
方法可以切断水管, 同样的调用 Subscription.cancel()
也可以切断水管, 不同的地方在于 Subscription
增加了一个 void request(longn)
方法, 这个方法有什么用呢, 在上面的代码中也有这么一句代码:
s.request(Long.MAX_VALUE);
这是因为 Flowable
在设计的时候采用了一种新的思路也就是 响应式拉取 的方式来更好的解决上下游流速不均衡的问题, 与我们之前所讲的 控制数量 和 控制速度 不太一样, 这种方式用通俗易懂的话来说就好比是 叶问打鬼子 , 我们把 上游看成 小日本 , 把 下游 当作 叶问 , 当调用 Subscription.request(1)
时, 叶问 就说 我要打一个! 然后 小日本 就拿出 一个鬼子 给叶问, 让他打, 等叶问打死这个鬼子之后, 再次调用 request(10)
, 叶问就又说 我要打十个! 然后小日本又派出 十个鬼子 给叶问, 然后就在边上看热闹, 看叶问能不能打死十个鬼子, 等叶问打死十个鬼子后再继续要鬼子接着打…
所以我们把request当做是一种能力, 当成 下游处理事件 的能力, 下游能处理几个就告诉上游我要几个, 这样只要上游根据下游的处理能力来决定发送多少事件, 就不会造成一窝蜂的发出一堆事件来, 从而导致OOM
. 这也就完美的解决之前我们所学到的两种方式的缺陷, 过滤事件会导致事件丢失, 减速又可能导致性能损失. 而这种方式既解决了事件丢失的问题, 又解决了速度的问题, 完美 !
同步情况
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
for (int i = 0; ; i++) { //无限循环发事件
emitter.onNext(i);
}
}
}).subscribe(new Consumer() {
@Override
public void accept(Integer integer) throws Exception {
Thread.sleep(2000);
Log.d(TAG, “” + integer);
}
});
当上下游工作在 同一个线程 中时, 这时候是一个 同步 的订阅关系, 也就是说 上游 每发送一个事件 必须 等到 下游 接收处理完了以后才能接着发送下一个事件.
同步与异步的区别就在于有没有缓存发送事件的缓冲区。
异步情况
通过subscribeOn
和observeOn
来确定对应的线程,达到异步的效果,异步时会有一个对应的缓存区来换从从上游发送的事件。
public enum BackpressureStrategy {
/**
- OnNext events are written without any buffering or dropping.
- Downstream has to deal with any overflow.
-
Useful when one applies one of the custom-parameter onBackpressureXXX operators.
/
MISSING,
/*
- Signals a MissingBackpressureException in case the downstream can’t keep up.
/
ERROR,
/* - Buffers all onNext values until the downstream consumes it.
/
BUFFER,
/* - Drops the most recent onNext value if the downstream can’t keep up.
/
DROP,
/* - Keeps only the latest onNext value, overwriting any previous value if the
- downstream can’t keep up.
*/
LATEST
}
背压策略:
- error, 缓冲区大概在128
- buffer, 缓冲区在1000左右
- drop, 把存不下的事件丢弃
- latest, 只保留最新的
- missing, 缺省设置,不做任何操作
上游从哪里得知下游的处理能力呢?我们来看看上游最重要的部分,肯定就是 FlowableEmitter
了啊,我们就是通过它来发送事件的啊,来看看它的源码吧(别紧张,它的代码灰常简单):
public interface FlowableEmitter extends Emitter {
void setDisposable(Disposable s);
void setCancellable(Cancellable c);
/**
- The current outstanding request amount.
-
This method is thread-safe.
- @return the current outstanding request amount
*/
long requested();
boolean isCancelled();
FlowableEmitter serialize();
}
FlowableEmitter
是个接口,继承Emitter,Emitter里面就是我们的onNext(),onComplete()
和onError()
三个方法。我们看到FlowableEmitter
中有这么一个方法:
long requested();
这张图的意思就是当上下游在同一个线程中的时候,在 下游 调用request(n)
就会直接改变 上游 中的requested
的值,多次调用便会叠加这个值,而上游每发送一个事件之后便会去减少这个值,当这个值减少至0的时候,继续发送事件便会抛异常了
可以看到,当上下游工作在不同的线程里时,每一个线程里都有一个requested
,而我们调用request(1000
)时,实际上改变的是下游主线程中的requested
,而上游中的requested
的值是由RxJava
内部调用request(n)
去设置的,这个调用会在合适的时候自动触发。
Rxjava实例开发应用
- 网络请求处理(轮询,嵌套,出错重连)
- 功能防抖
- 从多级缓存获取数据
- 合并数据源
- 联合判断
- 与 Retrofit,RxBinding,EventBus结合使用
Rxjava原理
- Scheduler线程切换工作原理
- 数据的发送与接收(观察者模式)
- lift的工作原理
- map的工作原理
- flatMap的工作原理
- merge的工作原理
- concat的工作原理
(顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)
https://github.com/xiangjiana/Android-MS
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
总结
Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
【Android高级架构视频学习资源】
Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!