美文网首页
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