RxJava在Android中的应用
主要内容:
github介绍:
a library for composing asynchronous and event-based programs by using observable sequences.
一个运行在Java VM上的库,通过可观察的序列来组成异步的、基于时间的程序。
解决问题:
让复杂程序逻辑回归简单、清晰
异步的介绍
ButterKnife 的配置:引入方式,(5.1.1的。。。
SystemClock.sleep(2000);//界面阻塞
开启子线程做耗时操作:异步请求获取数据(网络请求、数据库查询、文件读写等
code1:
getResuultAsync(){
calcService.calcAsync(10,5,this);
}
calcAsync(int total,int person,Activity a){
new Thread(new Runnable(){
...
a.onSuccess(result);
...
a.onFailed();
}).start();
}
code2:面向接口编程,通过监听回调的方式实现回调
calcAsync(int total,int person,OnResultListener a){
new Thread(new Runnable(){
...
a.onSuccess(result);
...
a.onFailed();
}).start();
}
总结,一种是在调用的时候传入接口,另一种是先设置监听方法,再调用请求方法。
build.gradle引入依赖
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
简单的基本使用:
Observable.create(….)
变形的使用1(被观察者变形):
Observable.just(T...)// 就相当于上面new 出来一个OnSubscribe对象
.subscribe(new Observer(){
onCompleted(){}
onNext(){}
onError(){}
});
变幻2:
Observable.from(new String[]{"a","b"})// 接收集合或者数组
.subscribe(new Subscriber(){// Subscriber是继承了Observer
onStart(){}// 多出来的一个方法,表示事件开始的时候
onCompleted(){}
onNext(){}
onError(){}
})
Subscriber subscriber = ...;
subscriber.unsubscribe();//在onStop的时候可以调用
onStop(){
if(subscriber!=null && !subscriber.isUnsubscribed()){
subscriber.unsubscribe();
}
}
变换3:
Observable.from(new String[]{"a","b"})
.subscribe(new Action1(){
prublic void call(String s){
}
});
变换4:
Observable.from(new String[]{"a","b"})
.subscribe(new Action1(){// onNext
public void call(String s){
}
},new Action1(){// onError
public void call(Throwable t){
}
},new Action0(){//onCompleted
public void call(){
sop("compeleted");
}
});
可能是将网络数据转成bean 也可能是cursor转成bean 或者流转成图片等等
Thread.currentThread().getName();在call 和next方法中打印线程名称发现都是main
Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
String name = Thread.currentThread().getName();
Log.d("tag", "call " + name);
subscriber.onNext("123");
subscriber.onNext("12343");
subscriber.onCompleted();
}
}).subscribe(new Observer() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
String name = Thread.currentThread().getName();
Log.d("tag", "onNext " + name);
}
});
}
指定线程:
subscribeOn : 可以执行多次
subscribe : 只需要执行一次,指定订阅者执行的线程
Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
String name = Thread.currentThread().getName();
Log.d("tag", "call " + name);
subscriber.onNext("123");
subscriber.onNext("12343");
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io())//让subscribe的操作执行在异步线程
.observeOn(AndroidSchedulers.mainThread())//让订阅者代码执行在UI线程
.subscribe(new Observer() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
String name = Thread.currentThread().getName();
Log.d("tag", "onNext " + name);
}
});
线程的切换案例:
微信:mm7718mm
QQ:3077485083