对于一个如此方便的框架,Java模式的加入是必不可少的,无论是Rxjava(观察者模式扩展)还是EventBus都有观察者模式,所以中间讲解该模式。
dependencies {
compile 'com.squareup:otto:1.3.8'
}
或者
//otto事件总线
compile 'com.squareup:otto:+'
bus.register(this);
bus.unregister(this);
发布:
bus.post(new MessageEvent());
注解
@Subscribe:这个在调用了register后有效,表示订阅了一个事件,并且方法的用 public 修饰的.方法名可以随意取,重点是参数,它是根据你的参数进行判断
@Produce注解告诉Bus该函数是一个事件产生者,产生的事件类型为该函数的返回值。
最后,proguard 需要做一些额外处理,防止混淆:
-keepattributes *Annotation*
-keepclassmembers class ** {
@com.squareup.otto.Subscribe public *;
@com.squareup.otto.Produce public *;
}
public class BusProvider extends Bus {
/**
* 通过单例模式返回唯一的bus对象,而且重写父类的post方法,通过handler实现任意线程可以调用
*/
private Handler mHandler = new Handler(Looper.getMainLooper());
private static Bus bus = new BusProvider();
private BusProvider(){
}
public static Bus getInstance(){
return bus;
}
@Override
public void post(final Object event) {
if (Looper.myLooper() == Looper.getMainLooper()) {
super.post(event);
}else {
mHandler.post(new Runnable() {
@Override
public void run() {
BusProvider.super.post(event);
}
});
}
}
}
/**
* Created by 刘志通 on 2018/7/4.
*/
public class OttoTestOne extends AppCompatActivity {
private Bus bus;
private Button button,button2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ottotwo_layout);
//订阅
bus = BusProvider.getInstance();
bus.register(this);
button = findViewById(R.id.id_two);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(OttoTestOne.this,OttoTestTwo.class);
startActivity(intent);
}
});
}
//注解接收String类型
@Subscribe
public void setText(String textstring) {
button.setText(textstring);
Log.e("检测1",textstring+"");
}
//接收bean类型
@Subscribe
public void setText2(EditBean textstring) {
button2.setText(textstring.getEdit1()+""+textstring.getEdit2());
Log.e("检测2", textstring.getEdit1()+""+textstring.getEdit2());
}
/**
* 取消订阅
* */
@Override
protected void onDestroy() {
BusProvider.getInstance().unregister(this);
super.onDestroy();
}
}
/**
* Created by 刘志通 on 2018/7/4.
*/
public class OttoTestTwo extends AppCompatActivity {
private Bus bus;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取实例
bus = BusProvider.getInstance();
//注册
bus.register(this);
setContentView(R.layout.ottoone_layout);
Button button=findViewById(R.id.id_btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*发送,这里发送的是bean,也可以直接发送String类型的数据,接收则是A中String类型的接收。*/
EditBean editBean=new EditBean();
editBean.setEdit1("ni");
editBean.setEdit2(" hao");
editBean.setTotal(" ma");
bus.post(editBean);
}
});
}
}
只要有activity或者fragment跳转到该页面后,事件就会自动产生,然后在订阅处(谁订阅谁改变)更新一些数据。
//获取实例
bus = BusProvider.getInstance();
//注册
bus.register(this);
setContentView(R.layout.ottothird_layout);
}
@Produce
public EditBean providerEvent(){
EditBean eventData = new EditBean();
eventData.setEdit1("hello world");
return eventData;
}
@Override
protected void onDestroy() {
super.onDestroy();
bus.unregister(this);
}
这里创建一个抽象观察者(Observer)和一个被观察者(Subject),然后继承抽象观察者,观察者们通过观察被观察者(Subject)来改变自己。
public class Subject {
private List<Observer> observers
= new ArrayList<Observer>();
private Observer observer;
private int state;
//变更情况
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
//绑定
public void binding(Observer observer) {
observers.add(observer);
}
/**
* unbinding(注销观察者,有时候在未获取到实例使用)
**/
public void unbinding(Observer cls) {
if (cls == null) throw new NullPointerException();
observers.remove(cls);
}
//通知
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
这里需要注意的是如果是常规集合是不能直接用remove的,要如下转换再行删除。
Iterator<Observer> iterator = observers.iterator();
/**
* 观察者
* */
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
需要注意的是,我这里创建了3个如下类,只粘贴出一个,分别是FirstObserver,SecondObserver,ThirdObserver。
public class FirstObserver extends Observer {
public FirstObserver(Subject subject) {
this.subject = subject;
subject.binding(this);//绑定
}
@Override
public void update() {
//用来更新数据
System.out.println("我是第一个观察者:"+subject.getState());
}
}
在主方法main中 这里是在每个子类的构造方法中加入了绑定,所以,只要创建对象就已经绑定了,无序再次绑定,当然也是可以解绑的。
//加载被观察者
Subject subject = new Subject();
//加载观察者
FirstObserver firstObserver = new FirstObserver(subject);
SecondObserver secondObserver = new SecondObserver(subject);
ThirdObserver thirdObserver = new ThirdObserver(subject);
subject.setState(2);
subject.notifyAllObservers();
subject.unbinding(secondObserver);
subject.setState(3);
subject.notifyAllObservers();
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。