美文网首页
EventBus 3.0的学习

EventBus 3.0的学习

作者: smallgrey | 来源:发表于2019-07-24 09:54 被阅读0次

    功能:通过解耦发布者和订阅者简化Android事件传递
    EventBus可以代替[Android]传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。

    特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。

    EventBus的简单实现

    第一步:添加依赖,在build.gradle中的dependencies{}
        implementation 'org.greenrobot:eventbus:3.1.1'  
    
    第二步:定义消息事件类
        public class MessageEvent{  
            private String message; 
            public  MessageEvent(String message){   
                this.message=message;   
            }   
            
            public String getMessage() {    
                return message; 
            }   
            
            public void setMessage(String message) {    
                this.message = message; 
            }   
        }   
    
    第三步:注册和解除注册

    在接收传递消息的Activity类里面的onCreate()方法和onDestory()方法里,进行注册EventBus和解除注册。

       @Override   
           protected void onCreate(Bundle savedInstanceState) {    
               super.onCreate(savedInstanceState); 
               setContentView(XXX);    
               EventBus.getDefault().register(this);   
           }   
           
       @Override   
           protected void onDestroy() {    
               super.onDestroy();  
               if(EventBus.getDefault().isRegistered(this)) {  
                   EventBus.getDefault().unregister(this); 
               }   
           }   
    
    第四步:接受事件

    在接受消息的Activity类里面写对于事件的处理
    在3.0版本中.通过@Subscribe注解,来确定运行的线程threadMode(默认是POSTING),是否接受粘性事件sticky以及事件优先级priority,priority值越大,越先收到事件或消息。

       @Subscribe  
       public void onMessageEventMain(MessageEvent event) {    
           Toast.makeText(this,event.getMessage()),Toast.LENGTH_SHORT).show();
       }   
    
    第五步:发送事件

    在发送消息的Activity类里面写,最好将发送事件的动作写到onStop()里面

            @Override   
            protected void onStop() {   
                super.onStop(); 
               EventBus.getDefault().post(new MessageEvent("XXXX"));    
            }   
    

    粘性事件
    之前说的使用方法,都是需要先注册(register),再post,才能接受到事件;如果你使用postSticky发送事件,那么可以不需要先注册,也能接受到事件,也就是一个延迟注册的过程。
    普通的事件我们通过post发送给EventBus,发送过后之后当前已经订阅过的方法可以收到。但是如果有些事件需要所有订阅了该事件的方法都能执行呢?例如一个Activity,
    要求它管理的所有Fragment都能执行某一个事件,但是当前我只初始化了3个Fragment,如果这时候通过post发送了事件,那么当前的3个Fragment当然能收到。但是这个时候
    又初始化了2个Fragment,那么我必须重新发送事件,这两个Fragment才能执行到订阅方法。
    粘性事件就是为了解决这个问题,通过 postSticky 发送粘性事件,这个事件不会只被消费一次就消失,而是一直存在系统中,知道被 removeStickyEvent 删除掉。那么只要订阅了
    该粘性事件的所有方法,只要被register 的时候,就会被检测到,并且执行。订阅的方法需要添加 sticky = true 属性。

    发布消息:

            EventBus.getDefault().postSticky(new StickyEvent("我是粘性事件"));
    

    接收消息:和之前的方法一样,只是多了一个 sticky = true 的属性。

              @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
              public void onEvent(StickyEvent event){
                  tv_c_result.setText(event.msg);
              }
    

    注册:

            EventBus.getDefault().register(CActivity.this);
    

    解注册:

              EventBus.getDefault().removeAllStickyEvents();
              EventBus.getDefault().unregister(CActivity.class);
    

    相关文章

      网友评论

          本文标题:EventBus 3.0的学习

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