eventbus包
包结构:
目前Android平台比较优秀的事件总线操作框架。
也许很多人会想问这个有什么用?这个其实类似于广播,一处发送,多处注册收发内容。
当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,例如:当某一条件发生时,应用中有几个部件对这个消息感兴趣,那么我们通常采用的就是观察者模式,使用观察者模式有一个弊病就是部件之间的耦合度太高,在这里我将会详细介绍Android中的解耦事件总线EventBus的使用。
(关于EventBus的基本操作可看Demo中的EventBusActivity,其他用法请参看Demo中com.tandong.sademo.eventbus里的其他演示用法类)
EventBus和Otto效率对比的演示请看Demo中com.tandong.sademo.eventbuspkotto中的相关类
< 用法>
//一处发送,多处接收
//自定义一个事件(不需要继承任何类),通常我比较喜欢定义一个Message类
//定义回调函数,相当于观察者模式中的on***Listener函数,在EventBus中可以定义四种类型的回调函数:
//onEvent 它和ThreadModel中的PostThread对应,这个也是默认的类型,当使用这种类型时,回调函数和发起事件的函数会在同一个线程中执行
//onEventMainThread,当使用这种类型时,回调函数会在主线程中执行,这个在Android中非常有用,因为在Android中禁止在子线程中修改UI
//onEventBackgroundThread,当使用这种类型时,如果事件发起函数在主线程中执行,那么回调函数另启动一个子线程,如果事件发起函数在子线程执行,那么回调函数就在这个子线程执行。
//onEventBusAsync,当使用这种类型时,不管事件发起函数在哪里执行,都会另起一个线程去执行回调。
public class EventBusActivity extends SmartActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// 类似于广播,在需要接收内容的地方注册EventBus(有多种注册方式,这里只展示其中几种)
// 注册:三个参数分别是,消息订阅者(接收者),接收方法名,事件类
EventBus.getDefault().register(this);
// EventBus.getDefault().register(this, "setTextA", SetTextAEvent.class);
// EventBus.getDefault().register(this, "setTextB", SetTextBEvent.class);
// EventBus.getDefault().register(this,"messageFromSecondActivity",SecondActivityEvent.class);
// EventBus.getDefault().registerSticky(this, "messageFromSecondActivity", SecondActivityEvent.class);
// EventBus.getDefault().register(this, "countDown", CountDownEvent.class);
}
public void postEvent(View view) {
// 分发(在你需要发送内容消息的地方使用调用即可)
EventBus.getDefault().post("SmartAndroid");
// EventBus.getDefault().post(new MyEvent());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
// 以下展示其中4种接收处理事件内容的方法,方法名称固定
public void onEventMainThread(String json) {// 接收事件内容地方(参数类型可以自己根据实际情况定义)
}
public void onEvent(Object obj) {// 默认接收事件内容地方(参数类型可以自己根据实际情况定义)
}
public void onEventAsync(Object event) {// 接收事件内容地方(参数类型可以自己根据实际情况定义)
}
public void onEventBackgroundThread(Object event) {// 接收事件内容地方(参数类型可以自己根据实际情况定义)
}
}