1.rxjava之操作符
1). 转换类操作符 (map flatMap concatMap flatMapIterable switchMap scan groupBy...);
map及flatMap以及concatMap区别?
map和flatMap都可以对RxJava传入的数据进行变换。
map对数据进行变换后,可以返回任意值,map对数据的变换是1对1进行的;
flatMap对数据变换后,返回ObservableSource对象,可以对数据进行一对多,多对多的变换,flatMap并不保证数据有序。
concatMap与flatMap使用基本一致,它可以保证数据有序。
2). RxJava中的组合/合并操作符:
作用:组合多个被观察者&合并需要发送的事件。
1、类型
常见的组合/合并操作符有:
1.组合多个被观察者
a.按发送顺序:concat()、concatArray()
b.按时间: merge()、mergeArray()
c.错误处理:concatDelayError()、mergeDelayError()
2.合并多个事件
a.按数量:Zip()
b.按时间:combineLatest()、combineLatestDelayError()
c.合并成1个事件发送:reduce()、collect()
3.发送事件前追加发送事件:startWith()、startWithArray()
4.统计发送事件数量:count
Rxjava概念, 常用操作符及拓展?
简介:
一款优雅的异步框架,代替之前的AsyncTask / Handler / XXX / …
其强大的操作符和链式写法,线程切换等有助于提高开发效率和快速定位Bug
与Retrofit搭配使用更是有意想不到的效果。 底层原理:观察者模式
缺点:
1:操作符太多会增加学习成本时间
2:使用不好,容易导致内存泄露(解决方式,推荐Rxlifecycle结合Rxjava,规避内存泄漏风险)
Rxjava的操作符有哪些,说说他们的作用?
just:将同种数据源组合放到被观察者上面
from:将类似数组、集合的数据源放到被观察者上面
map: 将一种数据源,转化成另外一种
flatmap:将一种数据源,转化成另外一种数据,并且被转化的数据是乱序排列的
concatmap:将一种数据源,转化成另外一种数据,并且被转化的数据是按照先前的数据源顺序排序的
toList:将数组的形式转化成List集合
subscribeOn:设置Observable的call方法所在的线程,也就是数据来源的线程
observeOn:设置subscribe的call方法所在的线程,也就是数据处理的线程
filter:在被观察者的数据层过滤数据
onErrorResumeNext:出错的时候,可以指定出错的时候的被观察者
retryWhen:出错的时候,重新走一遍被订阅的过程
concat:合并相同类型的被观察者到一个被观察者身上,有点类似集合、数组拼接数据。
zip:处理多种不同结果集的数据发射,一般用得多的地方是多个网络请求组合然后统一处理业务逻辑。 还有很多操作符就自己去看,这些操作符已经够面试用的了。
RxJava 变换操作符map flatMap concatMap buffer?
- map:【数据类型转换】将被观察者发送的事件转换为另一种类型的事件。
- flatMap:【化解循环嵌套和接口嵌套】将被观察者发送的事件序列进行拆分 & 转换 后合并成一个新的事件序列,最后再进行发送。
- concatMap:【有序】与 flatMap 的 区别在于,拆分 & 重新合并生成的事件序列 的顺序与被观察者旧序列生产的顺序一致。
- buffer:定期从被观察者发送的事件中获取一定数量的事件并放到缓存区中,然后把这些数据集合打包发射。
RxJava中map和flatmap操作符的区别及底层实现
手写rxjava遍历数组。
你认为Rxjava的线程池与你们自己实现任务管理框架有什么区别?
3.1. RxJava 的线程切换原理
• RxJava通过subscribeOn指定被观察者发生的线程,observeOn指定观察者发生的线程。其中Schedulers.IO生成的是IoScheduler。通过观察者与被观察者订阅的过程中,首先会触发被观察者的subscribeActual方法,在该方法中,可以看到最终会走scheduler的schedule方法,所以上面提到的IoScheduler实际是调用了它的schedule方法,最终会在NewThreadWorker里面生成ScheduledExecutorService对象,
而ScheduledExecutorService实际是由ScheduledThreadPoolExecutor创建的一个核心线程,最大线程个数是Integer.MAX_VALUE的线程池。最终会由ScheduledThreadPoolExecutor的submit或schedule方法执行传过来的Runnable对象,而Runnable执行的是被观察者的subscribe方法。所以解释了被观察者的subscribe方法是在子线程中执行的。
• observeOn是观察者发生的线程,AndroidSchedulers.mainThread()实质是HandlerScheduler对象,而在观察者部分,最终观察部分会走Scheduler的scheduleDirect方法,而 HandlerScheduler的该方法里面包装了一个ScheduledRunnable对象,通过主线程的handler.postDelayed处理这个runnable对象。