开源框架EventBus的使用

EventBus是greenrobot的开源项目。

它的特点是:

(1) 支持在不同类型的线程中处理订阅,包括发布所在线程,UI线程、单一后台线程、异步线程
(2) 支持事件优先级定义,支持优先级高的订阅者取消事件继续传递,支持粘性事件,是不是跟系统的有序广播、粘性广播很像啊
(3) 不是基于annotations
(4) 性能更优
(5) 体积小
(6) 支持单例创建或创建多个对象
(7) 支持根据事件类型订阅
http://www.slideshare.net/greenrobot/eventbus-for-android-15314813

使用它只需要四个步骤:
1.定义一个事件
public class MyEvent{};
2.注册订阅者
 EventBus.getDefault().register(this);
3.提交事件
 EventBus.getDefault().post(event);
4.接收事件
 public void onEvent(MyEvent event) {}
下面是例子:
实现广播和回调接口的功能
两个activity之间的事件订阅(需要用sticky),activity B ( Publisher)中点击发布事件( Event),activity A ( Subscriber)中订阅事件:
activity A中:
可以用方法名:

@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  initView();
  EventBus.getDefault().register(this, "messageFromSecondActivity",
    ActivityEvent.class);//订阅事件
 }
protected void onDestroy() {
  super.onDestroy();
  EventBus.getDefault().unregister(this);
 }

 public void messageFromSecondActivity(SecondActivityEvent event) {
  textView.setText(event.getText());
 }
也可以直接用默认方法onEvent(),方法名不对会报错:
@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  initView();
  EventBus.getDefault().register(this);//订阅事件
 }
protected void onDestroy() {
  super.onDestroy();
  EventBus.getDefault().unregister(this);
 }

 public void onEvent(SecondActivityEvent event) {
  textView.setText(event.getText());
 }

②activity B中:
@Override
 public void onClick(View v) {
  switch (v.getId()) {
  case R.id.button:
   EventBus.getDefault().post(new ActivityEvent("ok"));//发布事件

   break;
  }
 }

③事件类:
public classActivityEvent {
    private String text;
    public ActivityEvent(String text)
    {
        this.text=text;
    }
    public String getText(){
        return text;
    }
}

这里有两种订阅方式:
1. 使用普通的post()和register()方法, 由于在onDestroy()方法会调用unregister()方法,因此如果activity被销毁,请求将失效。

2.使用 postSticky()和registerSticky()方法:
postSticky会缓存最新的event事件,不管接收方是否消亡,载入时都会检测最新状态 ,因此在activity会被销毁的时候需要使用sticky。

ThreadMode共有四类,只需要在onEvent后面加上以下四种模式即可(onEventXXX):

  1. PostThread:默认的 ThreadMode,表示在执行 Post 操作的线程直接调用订阅者的事件响应方法,不论该线程是否为主线程(UI线程)。当该线程为主线程时,响应方法中不能有耗时操作,否则有卡主线程的风险。适用场景:对于是否在主线程执行无要求,但若 Post 线程为主线程,不能耗时的操作
  2. MainThread:在主线程中执行响应方法。如果发布线程就是主线程,则直接调用订阅者的事件响应方法,否则通过主线程的 Handler 发送消息在主线程中处理——调用订阅者的事件响应函数。显然,MainThread类的方法也不能有耗时操作,以避免卡主线程。适用场景:必须在主线程执行的操作
  3. BackgroundThread:在后台线程中执行响应方法。如果发布线程不是主线程,则直接调用订阅者的事件响应函数,否则启动唯一的后台线程去处理。由于后台线程是唯一的,当事件超过一个的时候,它们会被放在队列中依次执行,因此该类响应方法虽然没有PostThread类和MainThread类方法对性能敏感,但最好不要有重度耗时的操作或太频繁的轻度耗时操作,以造成其他操作等待。适用场景:操作轻微耗时且不会过于频繁,即一般的耗时操作都可以放在这里;
  4. Async:不论发布线程是否为主线程,都使用一个空闲线程来处理。和BackgroundThread不同的是,Async类的所有线程是相互独立的,因此不会出现卡线程的问题。适用场景:长耗时操作,例如网络访问








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值