Rxjava
因为其基于事件流的链式调用、逻辑简洁 & 使用简单的特色,深受各大 Android
开发者的欢迎。若是还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程java
Rxjava
的的基本使用 & 实际应用案例教学,即常见开发应用场景实现 ,并结合经常使用相关框架如Retrofit
等,但愿你们会喜欢。
- 本系列文章主要基于
Rxjava 2.0
- 接下来的时间,我将持续推出
Android
中Rxjava 2.0
的一系列文章,包括原理、操做符、应用场景、背压等等 ,有兴趣能够继续关注Carson_Ho的安卓开发笔记!!
RxJava
的简介以下api
Rxjava
的使用方式有两种: 方式1:分步骤实现 缓存
具体使用 请看文章Android RxJava:面向初学者的RxJava使用指南bash
RxJava
的实际开发应用场景 与 其对应的操做符息息相关RxJava
实际开发应用场景有以下:下面实例皆结合经常使用框架如
Retrofit
、RxBinding
、RxBus
等微信
需求场景 网络
需求场景 异步
功能需求说明ide
如 先进行 用户注册 的网络请求, 待注册成功后回再继续发送 用户登陆 的网络请求函数
下面展现的是结合
Retrofit
与RxJava
的基本用法,即未用操做符前
// 发送注册网络请求的函数方法
private void register() {
api.register(new RegisterRequest())
.subscribeOn(Schedulers.io()) //在IO线程进行网络请求
.observeOn(AndroidSchedulers.mainThread()) //回到主线程去处理请求结果
.subscribe(new Consumer<RegisterResponse>() {
@Override
public void accept(RegisterResponse registerResponse) throws Exception {
Toast.makeText(MainActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
login(); //注册成功, 调用登陆的方法
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Toast.makeText(MainActivity.this, "注册失败", Toast.LENGTH_SHORT).show();
}
});
}
// 发送登陆网络请求的函数方法
private void login() {
api.login(new LoginRequest())
.subscribeOn(Schedulers.io()) //在IO线程进行网络请求
.observeOn(AndroidSchedulers.mainThread()) //回到主线程去处理请求结果
.subscribe(new Consumer<LoginResponse>() {
@Override
public void accept(LoginResponse loginResponse) throws Exception {
Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Toast.makeText(MainActivity.this, "登陆失败", Toast.LENGTH_SHORT).show();
}
});
}
复制代码
解决方案 结合 RxJava2
中的变换操做符FlatMap()
实现嵌套网络请求
需求场景
功能说明 对于从磁盘 / 内存缓存中 获取缓存数据 的功能逻辑以下:
功能说明 即,同时向2个数据源获取数据 -> 合并数据 -> 统一展现到客户端
如,填写表单时,须要表单里全部信息(姓名、年龄、职业等)都被填写后,才容许点击 "提交" 按钮
功能说明 此处采用 填写表单 做为联合判断功能展现,即,表单里全部信息(姓名、年龄、职业等)都被填写后,才容许点击 "提交" 按钮
UI
需求场景
功能说明
需求场景
功能说明
a. 背景
- 发送 & 接收事件速度 = 单位时间内 发送&接收事件的数量
- 大多数状况,主要是 被观察者发送事件速度 > 观察者接收事件速度
b. 冲突
- 如,点击按钮事件:连续过快的点击按钮10次,则只会形成点击2次的效果;
- 解释:由于点击速度太快了,因此按钮来不及响应
下面再举个例子:
即出现发送 & 接收事件严重不匹配的问题
Observable.create(new ObservableOnSubscribe<Integer>() {
// 1. 建立被观察者 & 生产事件
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
for (int i = 0; ; i++) {
Log.d(TAG, "发送了事件"+ i );
Thread.sleep(10);
// 发送事件速度:10ms / 个
emitter.onNext(i);
}
}
}).subscribeOn(Schedulers.io()) // 设置被观察者在io线程中进行
.observeOn(AndroidSchedulers.mainThread()) // 设置观察者在主线程中进行
.subscribe(new Observer<Integer>() {
// 2. 经过经过订阅(subscribe)链接观察者和被观察者
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "开始采用subscribe链接");
}
@Override
public void onNext(Integer value) {
try {
// 接收事件速度:5s / 个
Thread.sleep(5000);
Log.d(TAG, "接收到了事件"+ value );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "对Error事件做出响应");
}
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件做出响应");
}
});
复制代码
OOM
c. 解决方案 采用 背压策略
至此,关于RxJava
常见的实际开发应用场景讲解完毕。
RxJava2
中经常使用的实际开发应用场景讲解进行了详细介绍,下面用1张图进行总结Android
中 Rxjava 2.0
的一系列文章,包括原理、操做符、应用场景、背压等等 ,有兴趣能够继续关注Carson_Ho的安卓开发笔记!!