比如:在后台做一些网络操作、查询或者一些复杂计算的时候, 我们如果不用其他框架的话, 最常见做法即自己开一个子线程, 然后通过回调的形式获取到结果(如后台以结果为参数发送广播,前台回调onReceive()接收获取到结果); 但是这样有一个问题, 随着业务逻辑越来越复杂, 项目会陷入回调中套回调的病区, 这对后期维护代码来说是一个很严重的问题;
异步操作库
;
它是一个能用非常简单的逻辑,去处理那些繁琐复杂任务 的
异步的操作事件库;
Rxjava在一定的程度上,
也能替代项目中非常多的Handler、AsyncTask
等等;package com.example.jiajiemu.a11.observe;
/**
* Created by Mjj on 2017/10/6.
*/
public interface Observerable {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
package com.example.jiajiemu.a11.observe;
/**
* Created by Mjj on 2017/10/6.
*/
public interface Observer {
public void update(int edition,float cost);
}
package com.example.jiajiemu.a11.observe;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Mjj on 2017/10/6.
*/
public class ConcreteObserverable implements Observerable {
private List<Observer> mObservers;
private int edition;
private float cost;
public ConcreteObserverable() {
mObservers = new ArrayList<>();
}
@Override
public void registerObserver(Observer o) {
mObservers.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = mObservers.indexOf(o);
if(i >= 0)
mObservers.remove(i);
}
@Override
public void notifyObservers() {
for(int i = 0; i < mObservers.size(); i++){
Observer observer = mObservers.get(i);
observer.update(edition, cost);
}
}
public void setInfomation(int edition,float cost){
this.edition = edition;
this.cost = cost;
//信息更新完毕,通知所有观察者
notifyObservers();
}
}
notifyObservers()
:
可以看到方法中所写,遍历所有观察者,
依次使每一个观察者调用update()方法
进行数据更新
(update()方法
在ConcreteObserver中具体实现): @Override
public void notifyObservers() {
for(int i = 0; i < mObservers.size(); i++){
Observer observer = mObservers.get(i);
observer.update(edition, cost);
}
}
package com.example.jiajiemu.a11.observe;
/**
* Created by Mjj on 2017/10/6.
*/
public class ConcreateObserver implements Observer {
private String name;
private int edition;
private float cost;
public ConcreateObserver(String name){
this.name = name;
}
@Override
public void update(int edition, float cost) {
this.edition = edition;
this.cost = cost;
buy();
}
public void buy(){
System.out.println(name+"购买了第"+edition+"期的杂志,花费了"+cost+"元。");
}
}
update()
方法中添加的业务逻辑buy()方法,
buy()方法是可以根据不同场景做相应的逻辑判断,数据更新;
或者可以在update()方法中添加更多的业务逻辑
;package com.example.jiajiemu.a11.observe;
/**
* Created by Mjj on 2017/10/6.
*/
public class Client {
public static void main(String[] args) {
//创建被观察者
ConcreteObserverable concreteObserverable = new ConcreteObserverable();
//创建三个不同的观察者
Observer observerA = new ConcreateObserver("A");
Observer observerB = new ConcreateObserver("B");
Observer observerC = new ConcreateObserver("C");
//将观察者注册到被观察者中
concreteObserverable.registerObserver(observerA);
concreteObserverable.registerObserver(observerB);
concreteObserverable.registerObserver(observerC);
//更新被观察者中的数据,当数据更新后,会自动通知所有已注册的观察者
concreteObserverable.setInfomation(5, 12);
}
}
setInformation()
,封装了一下notifyObservers()
:@Override
public void notifyObservers() {
for(int i = 0; i < mObservers.size(); i++){
Observer observer = mObservers.get(i);
observer.update(edition, cost);
}
}
public void setInfomation(int edition,float cost){
this.edition = edition;
this.cost = cost;
//信息更新完毕,通知所有观察者
notifyObservers();
}
1.一个方面的操作/处理
依赖于另一个方面的状态变化
;
(即观察者的操作依赖于被观察者的状态变化;
埋伏中的警察的操作依赖于小偷的状态变化,
球迷的操作依赖于球赛的状态变化)
参考自 慕课网