EventBus的使用

作者: 安卓小生 | 来源:发表于2016-08-30 15:39 被阅读30次

    EventBus

    EventBus是针一款对Android的发布/订阅事件总线。它可以让我们很轻松的实现在Android各个组件之间传递消息,并且代码的可读性更好,耦合度更低。

    使用步骤

    1. 首先需要定义一个事件,如:
      public class MyEvent{
      //这里面可以写需要调用的数据
      }

    2. 在需要订阅事件的地方注册事件,如:
      EventBus.getDefault().register(this);

    3. 产生事件,即发送事件,如:
      EventBus.getDefault().post(myEvent);

    4. 处理事件,在接受订阅事件的地方处理获取的事件,如:
      public void onEventMainThread(Event e){}

    5. 取消消息订阅,如:
      EventBus.getDefault().unregister(this);

    使用以上步骤就可以处理好一个普通的事件了。

    特别场景

    由于我们注册事件的时候基本上是在onCreateView()或者在onCreate()方法中,这回导致有时候我们的代码里接收不到发送来的事件。比如:当你在BActivity中的onCreate()中注册了事件,你再AActivity中post一个事件,但是由于你的BActivity
    没有创建,那么你就不会接收到事件,这时候就要使用粘性事件了。

    Stickey事件使用步骤

    1. 定义好一个事件,如:public class MyEvent{
      //这里面可以写需要调用的数据
      }
    2. 在需要订阅的地方订阅,如: EventBus.getDefault().registerSticky(this);此时订阅这个事件,如果此activity没有被创建,是不会走这个方法的,因此需要步骤三
    3. onEventMainThread(EventBus.getDefault().getStickyEvent(MyEvent.class));主动获取事件
    4. public void onEventMainThread(GotoMaterialEvent event) {//对事件进行处理}
    5. 发送粘性事件 EventBus.getDefault().postSticky(new MyEvent());

    由上面就可以完成黏性事件的处理了。

    下面请看我的代码:

    • 定义一个事件
    public class GotoMaterialEvent extends BaseEvent {
        private int page;
        private int item;
        public GotoMaterialEvent(int page) {
            this.page = page;
        }
        public int getPage() {
            return page;
        }
        public void setPage(int page) {
            this.page = page;
        }
        public int getItem() {
            return item;
        }
        public void setItem(int item) {
            this.item = item;
        }
    }
    
    • 订阅事件
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         EventBus.getDefault().registerSticky(this);
         return super.onCreateView(inflater, container, savedInstanceState);
     }
    
    • 主动获取事件

    onEventMainThread(EventBus.getDefault().getStickyEvent(GotoMaterialEvent.class));

    • 事件处理
    public void onEventMainThread(GotoMaterialEvent event) {
          int id = event.getItem();
          for (int i = 0; i < categroyIds.size(); i++) {
              if (id == categroyIds.get(i)) {
                  //公开课
                  indicatorViewPager.setCurrentItem(i, true);
              } else if (id == categroyIds.get(i)) {
                  //什么事acca
                  indicatorViewPager.setCurrentItem(i, true);
              } else if (id == categroyIds.get(i)) {
                  //新手指南
                  indicatorViewPager.setCurrentItem(i, true);
              }
          }
    
      }
    
    • 发送事件
    ll_home_acca_1.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   GotoMaterialEvent event = new GotoMaterialEvent(2);
                   event.setItem(2);
                   EventBus.getDefault().postSticky(event);
    
               }
           });
    

    以上是对粘性事件的处理

    相关文章

      网友评论

      本文标题:EventBus的使用

      本文链接:https://www.haomeiwen.com/subject/buofettx.html