Rxjava : 异步操作 变换 逻辑简洁清楚
观察者模式 观察者通过订阅的方式告诉被观察者,当你发生变化的时候你要告诉我。
Observable 被观察者 Observer观察者 subscribe 订阅
他们通过subscribe()方法来实现订阅关系。
Rxjava的回调方法 onNext()事件,onCompleted()事件队列结束标志,onError()事件异常,阻断新事件继续进行。
观察者Observer 实现方法(事件触发之后的行为)
Observer<String> Observer = new Observer<String>()
{
@override
Public void onNext(String s){}
@override
Public void onCompleted(){}
@override
Public void onError(Throwable e){}
};
Subscriber 是Observer的扩展
增加了onStart()方法用于在subscribe之后事件还没发送之前进行一些准备工作,它自己不能单独指定线程,要在subscribe线程里运行。
增加了unsubscribe()用于取消订阅,用之前先判断一下取消订阅了没有isUnsubscribe(),取消之后,subscribe将不再接收事件,不再需要订阅关系要及时释放资源避免泄露。
被观察者Observable实现方法(由它来触发某种事件)
Observable observable = Observable.create(new Observable
.OnSubscribe<String>(){
public void call(Subscriber<? super String> subscriber)
{
subscriber.onNext(“1”);
subscriber.onNext(“2”);
subscriber.onNext(“3”);
Subscriber.onCompleted();
}
})
Observable传入了一个OnSubscribe类型,当observable被订阅了的时候就会调用它的call()方法,这样回调subscriber(观察者)的方法把变动的事件(字符串)传给Observer(观察者),就完成了整个模式。
快捷发送事件
Observable observable = Observable.just(T...);
Observable observable = Observable.from(T[]...);
然后关联起来
Observable.subscribe(observer);
或Observable.subscribe(subscriber);
传进来的观察者还可以是不完整的,subscribe()方法可以自动创建出subscriber。
Action0 是无参 无返回值 Action1 有参数 无返回值,都有只有call()方法。
比如这么写
String names = {.......};
Observable.from(names).subscribe(new Action1(String){
public void call(String s)
{
这里就可以一个个把名字打印出来
}
});
比如 取某个id的图片资源放到view上,异常了打印
Int drableRes = ;图片资源id
ImageView imageview = ;view的对象
Observable.create(new Onsubscribe(Drable){
public void call(Subscriber<? Super Drable> subscriber)
{
subscriber.onNext(Drable);
subscriber.onCompleted();
}
}).subscribe(new Observer<Drable>(){
public void onNext(Drable drable)
{
imageview.setImageDrable(drable);
}
public void onCompleted(){};
public void onError(Throwable e)
{
Toast.makeText();
}
});
Scheduler(线程调度器)
Scheduler.newThread()总是启用新线程并在新线程执行操作
Scheduler.io()读写文件,网络请求,不能用于计算
Scheduler.computation()用于计算
AdroidScheduler.mainTread()主线程里运行
一般设置在subscribe前
subscribeOn(Scheduler.io())指定订阅操作在io线程
observeOn(AdroidScheduler.mainTread())subscriber回调指定在主线程里,这样在io线程那到数据并在主线程里更新页面。
对事件序列进行变换 Func1()包装有返回值的call方法
Observable.just(String a)
.map(new Func1<String,int>(){
Override
public int call(String a)
{
这里return 一个int类型回去
}
}).subscribe(new Action1(int){
Override
public void call(int b)
{
这里就拿到int 类型
}
});
这是一对一转化,还可以把对象的某个属性合起来发出去
Student[] student = ....;
Observable.from(student)
.flatMap(new Func1<Student,Observable<source>>(){
Override
public source call(Student s)
{
return Observable.from(student.getSource());
}
}).subscribe(new Observer<Source>(){
Override
public void onNext(Source s)
{
打印s.get........;
}
});