RxJava 2.x 理解-1
在RxJava 1.x 系列中,讲解了RxJava的大致用法,因为现在都用RxJava 2了,所以Rxjava 1就不细讲,主要来学习RxJava 2。
基本使用:
/**
* rajava2 的基本使用
*/
private void rxJava2BaseUser() {
Observable
.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
//throw new Exception("发生了错误");
}
})
.subscribe(new Observer<String>() { Disposable disposable; // 新增该方法
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.d(TAG, "onSubscribe");
disposable = d;
} @Override
public void onNext(@NonNull String s) {
Log.d(TAG, "Item: " + s);
if (s.equals("4"))
disposable.dispose(); // 在RxJava 2.x 中,新增的Disposable可以做到切断的操作,让Observer观察者不再接收上游事件
} @Override
public void onError(@NonNull Throwable e) {
Log.d(TAG, "onError:" + e.getMessage());
} @Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
}); Observable
.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("----- 01 -----");
emitter.onNext("----- 02 -----");
emitter.onNext("----- 03 -----");
}
})
// Consumer 和 RxJava 1 中的 Action1 类似
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.d(TAG, "Item: " + s);
}
});
}
基本使用和RxJava 1没有什么区别。
1.新增了onSubscribe方法,onSubscribe方法会在事件开始的时候,触发。
2.新增的Disposable可以做到切断的操作,让Observer观察者不再接收上游事件。
3.Action1 --> Consumer 只接收onNext方法。
Disposable
该怎么办呢, RxJava中已经内置了一个容器CompositeDisposable
, 每当我们得到一个Disposable
时就调用CompositeDisposable.add()
将它添加到容器中, 在退出的时候, 调用CompositeDisposable.clear()
即可切断所有的水管.线程切换:
/**
* rajava2 线程
*/
private void rxJava2Thread() {
Observable
.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
Log.d(TAG, "事件处理线程:" + Thread.currentThread().getName());
emitter.onNext("---- 1 ----");
emitter.onNext("---- 2 ----");
emitter.onNext("---- 3 ----");
}
})
.subscribeOn(Schedulers.newThread()) // 指明被观察者处理的线程
.observeOn(AndroidSchedulers.mainThread()) // 指明观察者线程
.subscribe(new Observer<String>() { @Override
public void onSubscribe(@NonNull Disposable d) {
Log.d(TAG, "onSubscribe:" + Thread.currentThread().getName());
} @Override
public void onNext(@NonNull String s) {
Log.d(TAG, "Item: " + s + " :" + Thread.currentThread().getName());
} @Override
public void onError(@NonNull Throwable e) {
Log.d(TAG, "onError:" + e.getMessage() + " :" + Thread.currentThread().getName());
} @Override
public void onComplete() {
Log.d(TAG, "onComplete:" + Thread.currentThread().getName());
}
});
}
结果:
02-10 10:02:31.007 25414-25414/pers.bolin.rxjava2demo D/MainActivity: onSubscribe:main
02-10 10:02:31.009 25414-25970/pers.bolin.rxjava2demo D/MainActivity: 事件处理线程:RxNewThreadScheduler-1
02-10 10:02:31.047 25414-25414/pers.bolin.rxjava2demo D/MainActivity: Item: ---- 1 ---- :main
02-10 10:02:31.048 25414-25414/pers.bolin.rxjava2demo D/MainActivity: Item: ---- 2 ---- :main
02-10 10:02:31.048 25414-25414/pers.bolin.rxjava2demo D/MainActivity: Item: ---- 3 ---- :main
可以看出事件已经被分到不同的线程去处理了。
.subscribeOn(Schedulers.newThread()) // 指明被观察者处理的线程
.observeOn(AndroidSchedulers.mainThread()) // 指明观察者线程
需要注意的是subscribeOn 只在第一次切换有效,observeOn每次切换都是有效的
看下线程的参数有哪些:
- Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
- Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作
- Schedulers.newThread() 代表一个常规的新线程
- AndroidSchedulers.mainThread() 代表Android的主线程
- Schedulers.single() 代表一个默认的、共享的、单线程支持的调度器实例,用于在相同的后台线程上执行强顺序执行。
- Schedulers.trampoline()代表当其它排队的任务完成后,在当前线程排队开始执行
变换/操作符:
just;from ;map ;flatMap 和RxJava使用一致:RxJava 1.x 理解-3
更多的操作符使用:
官方:http://reactivex.io/documentation/operators.html
RxJava 2.x 理解-1的更多相关文章
- RxJava 2.x 理解-3
背压:Flowable / Subscriber 在RxJava 1.x 理解 中,没有讲到背压这个概念,是因为学习太落后了,RxJava都出2了,所以直接在2上学. 背压是下游控制上游流速的一种手段 ...
- RxJava 1.x 理解-3
在 RxJava 1.x 理解-1 中,我们说到了RxJava的简单用法,但是这还远远不够,因为 输入的数据 ---> 被监听者(订阅源)对这些数据进行操作,或者执行响应的处理 --> 产 ...
- RxJava 1.x 理解-2
给RxJava 加入线程控制 -- Scheduler 在 RxJava 1.x 理解-1 中,我们说到了RxJava的简单用法,但是这还远远不够,因为这简单用法是在同一个线程中使用的.比如我们需要在 ...
- RxJava 2.x 理解-2
操作符总结: http://reactivex.io/documentation/operators.html https://github.com/ReactiveX/RxJava/wiki Ope ...
- RxJava 1.x 理解-1
先看下别人实现的最基本的RxJava的实现方式: 在RxJava里面,有两个必不可少的角色:Subscriber(观察者) 和 Observable(订阅源). Subscriber(观察者) Sub ...
- RxJava+RxAndroid+MVP入坑实践(基础篇)
转载请注明出处:http://www.blog.csdn.net/zhyxuexijava/article/details/51597230.com 前段时间看了MVP架构和RxJava,最近也在重构 ...
- 如何深入理解Java泛型
一.泛型的作用与定义 1.1泛型的作用 使用泛型能写出更加灵活通用的代码泛型的设计主要参照了C++的模板,旨在能让人写出更加通用化,更加灵活的代码.模板/泛型代码,就好像做雕塑时的模板,有了模板,需要 ...
- 必读的 Android 文章
必读的 Android 文章 掘金官方 关注 2017.06.07 13:58* 字数 25218 阅读 8782评论 2喜欢 218 写给 Android 开发者的混淆使用手册 - Android ...
- Android 使用Retrofit2.0+OkHttp3.0实现缓存处理+Cookie持久化第三方库
1.Retrofit+OkHttp的缓存机制 1.1.第一点 在响应请求之后在 data/data/<包名>/cache 下建立一个response 文件夹,保存缓存数据. 1.2.第二点 ...
随机推荐
- SpringMVC学习 -- ModelAndView , Model , ModelMap , Map 及 @SessionAttributes 的使用
输出模型数据: ModelAndView:处理方法返回值类型为 ModelAndView 时 , 其中包含视图和模型信息.方法体即可通过该对象添加模型数据 , 即 SpringMVC 会把 Model ...
- 最适合初学者学习的idea教程
https://github.com/judasn/IntelliJ-IDEA-Tutorial
- 【BZOJ3670】【NOI2014】动物园 [KMP][倍增]
动物园 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 近日,园长发现动物园中好吃懒做的动物 ...
- SSM初步整合一
SSM(spring+springmvc+mybatis)初步整合一配置步骤: 步骤一.导入所需jar包 步骤二 .配置web.xml文件 <?xml version="1.0&quo ...
- python Fielddata is disabled on text fields
# 执行https://www.elastic.co/guide/cn/elasticsearch/guide/current/_aggregation_test_drive.html中的例子时报错F ...
- 关于easyui checkbox 的一些操作处理
1.easyui在每一行加checkbox { field: 'id', title: '编号', checkbox: true } 2.easyui分页时记住前面已选的checkbox 设置easy ...
- 创建第一个maven项目的那些坑
1.记事本方式: class所在的目录结构: class的代码书写: package com.imooc.maven01.mode1; public class HelloWorld { public ...
- 几种常用排序算法的python实现
1:快速排序 思想: 任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序. 一趟快速排序的算法是: 1)设置 ...
- Selenium2+python自动化42-判断元素(expected_conditions)【转载】
前言 经常有小伙伴问,如何判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,在selenium的expected_conditions模块收集了一系列的场景判断方 ...
- flask学习:如何从config里载入配置
代码如下: 1.main.py from flask import Flask from config import DevConfig app=Flask(__name__) app.config. ...