EventBus3.0的使用详解


       学习一种技术我们先得了解下为什么要学习,它的优点是什么。 对于EventBus的话,我想作用大概有如下两点:代替

Thread+Handler的线程间通信方式和代替回调,EventBus主要用来做消息/事件的传递,可以代替传Intent,Handler,Broadcast或接口

函数在Fragment,Activity,Service,线程之间传递消息,开销更小,代码更加简洁易懂,其实主要作用是解耦,把本该有

联系的需要传引用的给简化了

 

1.EventBus的简单使用

(1)依赖

compile 'org.greenrobot:eventbus:3.0.0'

 

 (2) Activity注册Event

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

(3)Post Event

EventBus.getDefault().post("这是测试数据");
所有已注册EventBus的subscriber只要event_type相匹配,都可以收到该event

(4) Handle Event

   

     @Subscribe
     public void onMessageEvent(String message){
        Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
     }    
  

 
  注解@Subscribe来定义subscriber的回调method,方法名可以任意定义



2.ThreadMode用法

使用ThreadMode主要是来指定handle event的方法所指向的线程,我们先来看看ThreadMode枚举里面的内容

   public enum ThreadMode {
       POSTING,
       MAIN,
       BACKGROUND,
       ASYNC;
    }
(1)POSTING

默认的方式Handle Event跟Post Event在用一个线程

 @Subscribe(threadMode = ThreadMode.POSTING)
    public void handlerMessageEvent(MessageEvent event){
        Log.i(TAG, "handlerMessageEvent: "+event.getMessage());
    }

    @Subscribe
    public void handlerMessageEvent(MessageEvent event){
        Log.i(TAG, "handlerMessageEvent: "+event.getMessage());
    }
上面这两种方式的效果是一样的,都是指定handleMessageEvent方法运行的线程跟event post的线程是同一个


(2)Main

        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onMessage(MessageEvent event) {
           textField.setText(event.message);
        }

当指定threadMode为Main时,handle event的线程运行在UI线程,如果post event的线程也运行在UI线程的话,

那么跟POSTING的效果是一样的,注意使用此模式,不要堵塞UI线程


(3)BACKGROUND

 

        @Subscribe(threadMode = ThreadMode.BACKGROUND)
        public void onMessage(MessageEvent event){
           saveToDisk(event.message);
        } 

使用此模式,当Post Event的线程在子线程的话,那么Handle Event会在该线程中回调

如果Post Event运行在UI线程的话,那么Handle Event会开启一个后台线程去执行,按顺序

去分发所有事件


 (4)ASYNC

 当指定threadMode=Async时,handle event始终独立于UI线程和post event所在的线程,即:和post event不在同一线程,
 也不在UI线程。此模式适合耗时任务:e.g.:网络链接另外,EventBus使用线程池高效的使用线程


3.Sticky Events

当我们使用EventBus.getDefault().post(Object o)方式post event的话,必须先regist,然后Post Event,Handle Event才会起

作用,是当我们post event时,还没有subcriber怎么办?但是又想后注册的subscriber,能收到消息,这时sticky event就开始大

显身手了。

ActivityA中:

 public void postMessage(View view){
        EventBus.getDefault().postSticky(new MessageEvent("这是测试的数据"));
        startActivity(new Intent(this,MainActivityB.class));
    }

Activity中:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_b);
        tv_message= (TextView) findViewById(R.id.tv_message);
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(sticky = true,threadMode = ThreadMode.MAIN)
    public void handlerMesage(MessageEvent event){
        tv_message.setText(event.getMessage());
    }

结果我就不打印了,注意的是需要在handle event方法的上面需要加上sticky=true

(1) sticky event remove,阻断继续传递。 
 

 //返回的是之前的sticky event
         MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
         //Better check that an event was actually posted before
         if(stickyEvent != null) {
            //Now do something with it
         }


4.优先级和切断消息的传递

 //priority默认为0,不同ThreadMode下的分发流程不受优先级的影响
       //优先级高的可以优先获得消息
       @Subscribe(priority = 1);
       public void onEvent(MessageEvent event) { 
        …
        //不希望后续的subcriber收到消息,可以在收到消息后,调用cancelEventDelivery(Object event) 取消消息的后续传递。
        EventBus.getDefault().cancelEventDelivery(event) ;
       }

 EventBus的使用大概也就这儿多,下次带来EventBus3.0的源码解析吧

  

       

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值