- RxJava简介
- 基本组成
- 基本使用
- 分别定义
- Observable的变形
- Observer的变形
- 连续定义
- Scheduler
- 线程分类
- 线程使用
- Scheduler原理
- Scheduler使用变换
RxJava简介
RxJava可以看做是观察者模式的升级,使用RxJava的目的主要是为了数据异步处理。相比于Handler来说,优点就在于简洁,逻辑上非常简单明了。
基本组成
由Observable、Observer、Subscribe完成基本功能,Observable(被观察者)、Observer/Su(观察者)、Subscribe(订阅)这三部分完成观察模式。
Observable作为被观察者,在整个过程中担任消息通知的工作,可以指定自己本身的逻辑方法,并且通过onNext()、onComplete()将通知发出。
subscribe作为订阅,作为链条连接Observable与Observer,完成观察者与被观察者之间的联系。
Observer作为观察者,当收到通知后,能够在onNext()、onComplete()、onError()中处理通知内容。RxJava同时提供了Subscribe接口,该接口与Observer接口基本一致,另加了onStart():在通知发送前执行预准备代码;unsubscribe()方法:用于取消订阅,应及时在不需要时调用,避免内存泄漏。
基本使用
1.分别定义
//创建Observable
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Hi");
subscriber.onNext("Aloha");
subscriber.onCompleted();
}
});
//创建Observer
Obaserver observer = new Observer<String>() {
@Override
public void onNext(String text) {
Log.i("TAG", text);
}
@Override
public void onCompleted() {
//TODO 完成内容
}
@Override
public void onError(Throwable e) {
Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
}
};
//订阅
observable.subcribe(observer);
2.Observable的变形
Observable observable = Observable.just("This", "is", "RxJava");
以上代码执行后将会**依次执行**onNext(“This”),onNext(“is”),onNext(“RxJava”),onComplete();
String[] strs = {"This", "is", "RxJava"};
Observable observable = Observable.form(strs);
以上代码执行后将会**依次执行**onNext(“This”),onNext(“is”),onNext(“RxJava”),onComplete();
3.Observer的变形
能够单独抽出onNext()、onComplete()、onError()来对Observable进行观察。
//onNext() ————参数可定义为其他类型
obserable.subcribe(new Action1<String>(){
public void call(String next){
Log.i(TAG, next);
}
});
//onError()
obserable.subcribe(new Action1<Throwable>(){
public void call(Throwable throwable){
}
});
//onComplete()
obserable.subcribe(new Action0(){
public void call(){
"Complete 不存在参数"
}
});
4.连续定义
Observable.create(new OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("run onNext()");
subscriber.onCompleted();
}
}).subscribe(new Observer<String>() {
@Override
public void onNext(String text) {
Log.i("TAG", text);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
}
});
Scheduler
了解以上的内容后,RxJava的基本使用已经没啥问题了,然而,正如之前所说,我们大多数使用RxJava的目的是达到不同线程之间的通信并且让这一过程的逻辑尽量简洁。
而上面所介绍的所有动作都是在同一线程中完成的。也就是说在默认时,Observable中方法、Observer中方法都会在Retrofit创建的线程中运行。而在这一情况下,我们使用RxJava就没有意义了。这时就需要使用到Scheduler来进行线程控制。
线程分类
Schedulers.immdiate:当前线程(默认值)
Schedulers.io:适合IO操作(文件读写、网络数据交互)
Schdulers.newThread:开启新线程
Schdulers.computation:计算线程(常用于图像计算)
AndroidSchdulers.mainThread:Android中特用,主线程(UI线程)
线程使用
sbuscribeOn():被观察者动作线程
observerOn():观察者处理线程
Scheduler原理
之前看到扔物线大神说这里是精华部分,嗯,反正我是看high了。关于这一部分,我目前实在是没有太多精力完全看明白,所以先不献丑了,等到后期我能够完全理解后,再向大家介绍。
Scheduler使用(变换)
- map()
能够完成对象的转换。将Observable获取的对象通过map()将数据从一种对象装换为另一对象,配合Function1完成这一动作。
Func1<Object1, Obejct2>()
Object1:代表参数对象
OBejct2:代表返回对象
Func1与Action1基本一致,唯一区别就在于Func1存在返回值。
- flatmap()
完成对象转换,并且是将一个对象转换为Observable
' 单调的文字说明是有点绕,用代码来看看 '
' 设定: '
' Person:包含属性 name(String), age(int), address(Address[]) 包含多个'
' 目的:获取所有的朋友所有住址名称'
Person[] persons = "......";
Observable.from(persons).
flatmap(new Func1<Person, Observable<friend, Address>>(){
public Observable<Address> call(Person person){
return Observable.from(person.getAddress());
}
}).
subscribe(new Action1<Address>(){
public void call(Address address){
Log.i("TAG", address.getName());
}
});
打完收功。是不是很简单,都不用解释。
来来来,你把键盘放下,我好好说话。
那么这个flatmap到底做了啥,我们先来观察一下代码。
目的是要获取每个Person的所有Address
flatmap()首先处理Person对象,从一个person对象中获取Address[],之后将获取到的Address[]通过Observable.from()依次处理,return这个点上,所做的是将Observable依次传递给Observer处理。而Observer将会获取到Address,用来进一步处理。
嗯,解释的很清楚,再不懂就不能怪我。
好好好,先把鼠标线从我脖子上拿开,我再给你画张图。
清晰,明了,给自己点赞。
以上的内容就是目前对RxJava的理解啦,现在网上还有很多大神关于这一部分的讲解,大多都很详细,本文算是交流学习的记录吧。
关于MVP和MVVM嘛,搜索的时候看到的RxJava和Retrofit,实在没忍住就先学习了下RxJava,放心放心,MVP会写的,毕竟离月底还有一段时间。( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)