- 了解RxJava也蛮久了,原来一直不了解其中的原理,尤其是配合Retrofit组合之后线程切换和类型转换老是晕,刚刚有些理解、 乘热打铁,记录一下。
1.RxJava基本逻辑
-
添加依赖
RXjava compile 'io.reactivex:rxjava:1.2.4' compile 'io.reactivex:rxandroid:1.2.1' ---Retrofit配合Rxjava compile 'com.squareup.retrofit2:retrofit:2.1.0'//retrofit依赖 compile 'com.squareup.retrofit2:converter-gson:2.1.0'//gson转换器 compile 'com.squareup.retrofit2:converter-scalars:2.1.0'//标准类型转换器 compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'//rxjava转换器 ---Rxbinding依赖 compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
-
Lambda配置(可忽略)
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}//添加在Android下面的编译配置dependencies { classpath 'com.android.tools.build:gradle:2.2.3' classpath 'me.tatarka:gradle-retrolambda:3.4.0'//插件下载路径 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } apply plugin: 'me.tatarka.retrolambda'//运用插件
Rxjava运用观察者模式、通过观察者(Observer)/订户(Subscriber )来订阅被观察者
为了更好使用链式编程、使用的是被观察者订阅观察者(为了可以使用链式编程使得语义相反)
observable.subscribe(subscriber/observer);
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("dfjhsklafj");
subscriber.onNext("a");
}
}).subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String o) {
}
});
Observable.create 传入OnSubsecible接口变量实现onCall方法
也可以使用from来获取本地数组资源
Observable.from(getResources().getStringArray(R.array.RX)).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("s = " + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
});
被观察者可以使用just代替create传递1--10个参数
观察者/订阅者可以使用Action来替代它的三个参数
/**
* 简化观察者,用方法Action1代替观察者的接口三个方法,选择要使用的1--3方法
*/
private void Action1(){
Observable.just('a').subscribe(new Action1<Character>() {
@Override
public void call(Character s) {
System.out.println("s = " + s);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
}, new Action0() {
@Override
public void call() {
}
});
上述可以使用Lambda表达式简化逻辑
只执行观察者Action1的onNext方法
Observable.create((f)->f.onNext('a')).subscribe((c)-> System.out.println("c = " + c))
三个方法Action1、Action1、Action0都执行
Observable.just('a','b').subscribe(
(num)->Log.e("s","s" +num),
(ex)-> ex.printStackTrace(),
()-> System.out.println(" = " )
);
线程切换(从上往下找)
//Schedulers
//IO()网络线程、无法控制最大线程数量
// newThread()开启新的线程、
// immediate()当前线程默认、
// computation()计算线程会计算当前cpu个数来决定开多少线程,有效控制线 程最大数量
//AndroidSchedulers.mainThread()主线程
subScribeOn()订阅发生所在线程(语义是被观察者订阅观察者),所以是被观察者线程
observeOn()执行观察者处理数据所在线程
doOnScrible
*subscribeOn()
: 指定subscribe()
所发生的线程,即Observable.OnSubscribe
被激活时所处的线程。或者叫做事件产生的线程。 *observeOn()
: 指定Subscriber
所运行在的线程。或者叫做事件消费的线程。
添加进度框
-
map:将被观察者数据类型转换为其他类型Fun1
Observable.just(path) .map(new Func1<String, CharSequence>() { @Override public CharSequence call(String s) { return getData(s);//将数据路径读取成字符串 } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe((next) -> tv.setText(next));
-
flatMap:被观察者二次变幻转成新的观察者->桥接模式
区别:map第二个参数为目标类型
flatMap : 第二个参数是另一个被观察者对象的类型
lift:观察者类型转换,类似于map,但是处理转换的是观察者
compose:转换的是被观察的对象,接口名是Transformer
1
数据配合Rxjava进行Retrofit网络请求
-
retrofit请求后返回call对象通过rxjavaAdapter转换成被观察者对象,然后在给处理后给观察者对象
1.网络请求接口使用被观察者对象
{path}放入url路径相对名字
@Query(s) String q //查询的键值对xx?s=q
@URL String url //表示url路径如果写了base url 会根据http是否开头只能判断是否加载全部url@GET("/dianying/v2/search/movies.json") Observable<News> getNews(@Query("client") String client);
2.转换加载数据
new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())//字符串转换器
.addConverterFactory(GsonConverterFactory.create())//json转换器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//Call->rxJava适配器!!!执行完call后返回被观察者实体类对象
.build().create(NewsServiceNet.class)//接口类
.getNews(str)//获取数据
.subscribeOn(Schedulers.io())//被观察者订阅在io线程
.observeOn(AndroidSchedulers.mainThread())//观察者在主线程执行
.subscribe(
(news)->{
if (news == null) {
Toast.makeText(this, "无", Toast.LENGTH_SHORT).show();
}
List<News.Data> data = news.getData();
System.out.println("data = " + data);
tv.setText(data.toString());
},
Throwable::printStackTrace
);//订阅者处理事件
RxBinding
RxView.clicks(iv).throttleWithTimeout(1000, TimeUnit.MILLISECONDS).subscribe(
(v)->loadData()
);//防抖时间,观察者执行点击事件
RXBus
- 类型EventBus出现,使用Rx链式思想
未完待续
网友评论