美文网首页
EventBus3.0使用详解

EventBus3.0使用详解

作者: Cris_Ma | 来源:发表于2019-06-13 13:09 被阅读0次

    EventBus3.0

    Gradle依赖:

    implementation 'org.greenrobot:eventbus:3.0.0'
    

    结构:

    • Event:事件

    • Publisher:发送者,发送需要处理的消息

    • Subscriber:订阅者,定义事件处理方法,必须通过register方法来注册。

    线程:

    • POSTING (默认):在发送事件的线程处理事件

    • MAIN:主线程处理

    • BACKGROUND:后台线程处理,如果主线程发送,则新建线程

    • ASYNC:始终在其他线程处理

    使用方法:

    1.定义Event:

    public class EventMsg {
    
        public EventMsg(String msg){
            this.msg = msg;
        }
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        String msg;
    }
    
    1. 在需要处理事件类中注册EventBus,如果是Activity或者Fragment等有生命周期的组件,需要在销毁时解除注册,以防内存泄漏。
     @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            EventBus.getDefault().register(this);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            EventBus.getDefault().unregister(this);
        }
    
    1. 定义事件处理方法,在3.0以前方法名是固定的,3.0以后可以通过注解指定:
    
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void handleMessage(EventMsg msg) {
            Toast.makeText(this,"Received message: " + msg.getMsg(), Toast.LENGTH_SHORT).show();
        }
    
    
    1. 发送事件:
      EventBus.getDefault().post(new EventMsg("Event Bus 3.0!!"));
    

    注意:一个事件只能被处理一次。

    1. 粘性事件:
        @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
        public void handleMessage(EventMsg msg) {
            Toast.makeText(this,"Received message: " + msg.getMsg(), Toast.LENGTH_SHORT).show();
        }
    
    
        EventBus.getDefault().postSticky(new EventMsg("Event Bus 3.0!!"));
    

    粘性事件:事件发出之后可以作为普通事件被没有 sticky = true 修饰的方法处理,但是处理完之后事件不会消失,后续新增的订阅者依然可以收到该事件,但是处理方法必须有 sticky = true 修饰。如果想要移除粘性事件,需要手动移除:

     EventBus.getDefault().removeStickyEvent(EventMsg.class);
     EventBus.getDefault().removeStickyEvent();
    

    相关文章

      网友评论

          本文标题:EventBus3.0使用详解

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