Android EventBus详解

在  https://github.com/greenrobot/EventBus 中下载 EventBus
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法

使用方法
1> 定义事件, 定义一个类,继承默认的Object即可,用于区分事件和传输数据,如:
public class MsgEvent1 {
  private String msg;

  public MsgEvent1(String msg)
  {
  super ();
  this .msg = msg;
  }

  public String getMsg()
  {
  return msg ;
  }
}

public class MsgEvent2 {
  private String msg;

  public MsgEvent2(String msg)
  {
  super ();
  this .msg = msg;
  }

  public String getMsg()
  {
  return msg ;
  }
}

2> 添加订阅者:EventBus.getDefault().register(this); 将所在类作为订阅者,框架会通过反射机制获取所有方法及其参数,有如下四种方法:
订阅者所在类可以定义以下一个或多个方法用以接收事件:
  public void onEvent(param)
  public void onEventMainThread(param)
  public void onEventBackgroundThread(param)
  public void onEventAsync(param)
如:
public class RightFragment extends Fragment {
  private TextView tv;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super .onCreate(savedInstanceState);
    // 界面创建时,订阅事件, 接受消息
    EventBus. getDefault().register( this);
  }

  @Override
  public void onDestroy() {
    super .onDestroy();
    // 界面销毁时,取消订阅
    EventBus. getDefault().unregister( this);
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_right , null);
    tv = (TextView) view.findViewById(R.id. tv );
    return view;
  }

  /**
  * 与发布者在同一个线程
  *
  * @param msg
  * 事件1
  */
  public void onEvent(MsgEvent1 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEvent(MsgEvent1 msg)收到" + content);
  }

  /**
  * 执行在主线程。 非常实用,可以在这里将子线程加载到的数据直接设置到界面中。
  *
  * @param msg
  * 事件1
  */
  public void onEventMainThread(MsgEvent1 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEventMainThread(MsgEvent1 msg)收到" + content);
    tv.setText(content);
  }

  /**
  * 执行在子线程,如果发布者是子线程则直接执行,如果发布者不是子线程,则创建一个再执行 此处可能会有线程阻塞问题。
  *
  * @param msg
  * 事件1
  */
  public void onEventBackgroundThread(MsgEvent1 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEventBackgroundThread(MsgEvent1 msg)收到" + content);
  }

  /**
  * 执行在在一个新的子线程 适用于多个线程任务处理, 内部有线程池管理。
  *
  * @param msg
  * 事件1
  */
  public void onEventAsync(MsgEvent1 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEventAsync(MsgEvent1 msg)收到" + content);
  }

  /**
  * 与发布者在同一个线程
  *
  * @param msg
  * 事件2
  */
  public void onEvent(MsgEvent2 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEvent(MsgEvent2 msg)收到" + content);
    tv.setText(content);
  }
}
注:发布者 post方法参数是Object类型,也就是可以发布任何事件。订阅者接受消息时,只要定义的是第二步四个方法任意一个,并且参数和发布者发布的一致,即可被执行。发布者也可以通过第二步接收消息,订阅者也可以作为发布者发消息给自己

3> 发布者发布事件
public class LeftFragment extends ListFragment {
  @Override
  public void onViewCreated(View view, Bundle savedInstanceState) {
    super .onViewCreated(view, savedInstanceState);
    String[] strs = new String[] { "主线程消息1" , "子线程消息1" , "主线程消息2" };
    setListAdapter( new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1 , strs));
  }

  @Override
  public void onListItemClick(ListView l, View v, int position, long id) {
    switch (position) {
      case 0:  // 主线程
        System. out .println("----------------------主线程发的消息1" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
        EventBus. getDefault().post( new MsgEvent1( "主线程发的消息1" ));
      break ;
      case 1:  // 子线程
        new Thread() {
          public void run() {
              System. out .println("----------------------子线程发的消息1" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
              EventBus. getDefault().post( new MsgEvent1( "子线程发的消息1" ));
          };
        }.start();
      break ;
      case 2:  // 主线程
        System. out .println("----------------------主线程发的消息2" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
        EventBus. getDefault().post( new MsgEvent2("主线程发的消息2" ));
      break ;
      }
  }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值