Rxjava
Rxjava主要作用就是用来处理异步,当你的业务需要访问数据库,访问网络,或者任何耗时的操作,都可以借助Rxjava来实现。
但是有人说在Android中已经有很多异步操作的API,比如Handler,AsyncTask等,这些都能满足基本的异步操作,为什么还要使用Rxjava呢?
首先我们开看一个例子做个比较:
假设有这样一个需求:界面上有一个自定义的视图 imageCollectorView ,它的作用是显示多张图片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数组 File[] folders 中每个目录下的 png 图片都加载出来并显示在 imageCollectorView中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在 UI 线程执行。
常用的实现方式有多种,比如:
代码块1
//采用android自带的api实现
new Thread() {
@Override
public void run() {
super.run();
for (File file : files) {
File[] files = folder.listFiles();
for (File file : files) {
if (file.getName().endsWith(".png")) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
imageCollectorView.addImage(bitmap);
}
});
}
}
}
}
}.start();
如果使用Rxjava,则可以这样实现:
代码块2
//采用Rxjava实现
Observable.from(folders)
.flatMap(new Func1() {
@Override
public Observable call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});
虽然代码块2的代码量比代码块1的代码量要多,但是很明显代码块2的代码看起来更整洁更优雅,而且如果读者学过Rxjava的人,会明显感觉到代码块2的可读性比代码块1的可读性要强。
由此可见Rxjava的优点即是:采用链式调用,代码简洁优雅有美感,并且可读性增强!
以上,是Rxjava的一部分优点,其实Rxjava的优点更在于它的强大。
下面我们简单了解一下Rxjava的原理:
Rxjava实现异步的方法是通过观察者模式实现的。
什么事观察者模式呢?
举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。
在Android中最常见的观察者模式是View的onClick事件模型。
如图可见,当Button持有OnClickListener对象之后,Button被点击之后会自动触发OnClickListener中的OnClick方法。
把上面的Button点击事件抽象一下就变成:
当Observable(可观察的,被观察者)的状态发生变化时,内部会通过一系列事件触发Observer(观察者)中的方法,可以做出相应的操作。
可能这样讲还是比较抽象,举个简单的生活中的例子:
以上模型中,上课铃声是被观察者,即Observable,可观察的,被观察者;学生就是观察者,即Observer(观察者),学生听到上课铃声响了,就会去上课,这就是学生根据上课铃声所做出的反应。
也就是:
被观察者状态发生变化,观察者可以做出反应。
在Rxjava中观察者模式
RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以根据情况回调来通知 Observer。
Rxjava常用的的回调方法有三种:
- onNext:完成队列中的一个事件
- onComplete:完成队列中所有的事件
- onError:事件发生错误时,并且后续的事件终止。
为什么Rxjava要使用观察者模式呢?
因为观察者模式在模块之间划定了清晰的界限,降低模块耦合性,提高了代码的可维护性和重用性。
Rxjava基本使用方法
创建Observer
Observer是观察者,当被观察者状态发生变化的时候,他会收到相应的事件,使用者可以根据不同的事件进行不同的处理。
Observer observer = new Observer() {
@Override
public void onCompleted() {
Log.d("Rxjava demo", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.d("Rxjava demo", "onError");
}
@Override
public void onNext(String s) {
Log.d("Rxjava demo", "onNext");
}
};
其实,除了使用Observer以外,Rxjava还有个Subscriber。这个是实现了Observer的抽象类,里面对Observer进行了一些扩展。
Subscriber subscriber = new Subscriber() {
@Override
public void onStart() {
super.onStart();
}
@Override
public void onNext(String s) {
Log.d("Rxjava demo", "Item: " + s);
}
@Override
public void onCompleted() {
Log.d("Rxjava demo", "Completed!");
}
@Override
public void onError(Throwable e) {
Log.d("Rxjava demo", "Error!");
}
};
可以看出,Subscriber比Observer多了一个回调方法onStart(),它会在事件开始执行之前的时候调用,用于做一些准备工作,类似于AsyncTask中的onPreExecute方法。
但是subscriber中还有几个很重要的方法:
- unsubscribe():这个方法是取消订阅事件,一般有利于防止内存泄漏。在android开发中我们知道一般有订阅就应该有取消订阅。
- isUnsubscribed():这个方法是用于判断事件是否被订阅。
- add(Subscription s):这个方法是把一个Subscription 添加到Subscription列表中,便于统一管理,取消订阅等
2. 创建Observable
Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber
- 矩阵的等价,相似,合同,正定判定和关系
- 行列式运算法则 矩阵的运算及其运算规则:
- 微分意义,积分意义: 牛顿-莱布尼茨公式 莱布尼茨公式求高阶导数
- 参数方程中参数的意义: 参数方程定义: 什么是参数方程: 参数方程与普通方程的公式
- 大数据应用,智慧农业方案,智慧农业-智能畜牧,智慧农业设施农业(大棚) 树形结构图,高标准农田(大田)树形结构图分为4层架构;
- JMeter入门教程,汇总报告,聚合报告,图形结果, ramp-up period的作用, Assertion和Assert Results
- JMeter,LoadRunner,软件压力测试?
- 修改PDF中文字好用的软件,PDF编辑软件,adobe acrobat DC安装教程,adobe acrobat DC和 adobe acrobat pro的区别,
- 智慧农业解决方案-智慧农业电子科技威海
- 智慧农业解决方案
