EventBus的使用(二)注解

             在上一篇博客EventBus的使用(一)中,已经介绍了EventBus的强大之处和基本的使用,这一篇博客来深入的了解一下EventBus。

            相关博客:

            EventBus的使用(一)   博客地址: http://blog.csdn.net/bo543937071/article/details/53517693

            EventBus的使用(三)粘性事件  博客地址:http://blog.csdn.net/bo543937071/article/details/53540953

             大家在使用EventBus的时候,有没有注意到一处关键的地方,就是注解,例如:





         @Subscribe(threadMode = ThreadMode.MAIN)
      其中,ThreadMode有四个参数,分别是MAIN,POSTING,ASYNC和BACKGROUND;
      通过代码进行实际操作,观察四种方式的特点:(省略了一些EventBus必要步骤,如要运行,参考上一篇博客)
         说明:下面的代码写在接收消息的类,也就是在EventBus的使用(一)中的MainActivity下
      首先试一下主线程用Post发布进行测试,看一下哪个方法被调用,在控制台打印日志
      在Log日志中Thread.currentThread().getName()的作用是获取线程的名字。
      public void onClick(View v) {
         switch (v.getId()) {
            case R.id.button:  
                //使用EventBus的主线程发送事件         
                EventBus.getDefault().post(new EventBusMessage("你好我是子页面,给你主页面发送一个消息"));
                Log.d("EventBusThread",Thread.currentThread().getName());   
            break;
         }
      }

      //下面的四个方法皆是接收EventBus发送的对应事件,只有参数一致,都可以接收到
      @Subscribe(threadMode = ThreadMode.MAIN)
      public void ReciveMessage(EventBusMessage eventBusMessage){
          Log.d("EventBusThread","ThreadMode.MAIN:"+Thread.currentThread().getName());
      }

      @Subscribe(threadMode = ThreadMode.POSTING)
      public void ReciveMessage1(EventBusMessage eventBusMessage){
          Log.d("EventBusThread","ThreadMode.POSTING:"+Thread.currentThread().getName());
      }

      @Subscribe(threadMode = ThreadMode.ASYNC)
      public void ReciveMessage2(EventBusMessage eventBusMessage){
          Log.d("EventBusThread","ThreadMode.ASYNC:"+Thread.currentThread().getName());
      }

      @Subscribe(threadMode = ThreadMode.BACKGROUND)
      public void ReciveMessage3(EventBusMessage eventBusMessage){
          Log.d("EventBusThread","ThreadMode.BACKGROUND"+Thread.currentThread().getName());
      }
运行后效果:
EventBus的使用(二)注解_第1张图片
              在试一下放在子线程: 对点击事件进行修改
      @Override
      public void onClick(View v) {
           switch (v.getId()) {
                //使用EventBus在子线程发送事件
  case R.id. button: new Thread(){ public void run() { EventBus. getDefault().post( new EventBusMessage( " 你好我是子页面 , 给你主页面发送一个消息 ")); Log. d( "EventBusThread",Thread. currentThread().getName()); }; }.start(); break; } } 运行后效果: EventBus的使用(二)注解_第2张图片 通过运行效果图,控制台所打印出来的线程名,总结一下输出数据: 在主线程运行 在子线程运行 main: 主线程 主线程 posting: 主线程 子线程 background: 新开一个子线程 子线程 async: 新开一个子线程 新开一个子线程                 我们可以通过这两张效果图可以做一下总结:      
               ThreadMode.Main:表示这个方法在主线程中执行(适合做异步加载,可以将子线程加载到数据直接设置到UI界面)。
              ThreadMode.Posting:表示该方法和消息发送方在同一个线程。
              ThreadMode.ASYNC:表示无论发送方是在子线程还是在主线程,都会开一个新的子线程去运行,适用于多  个线程任务,内部有线程池管理,比如请求网络时,用这个方法,他会自动创建方法去请求,可以异步并发处理。
             ThreadMode.BackGround:表示该方法在后台运行(也就是子线程),不能够并发处理,如果发布者在子线程,那么该方法就在子线程执行。如果发布者在主线程,那么该方法就会创建一个子线程,在子线程运行。


     

你可能感兴趣的:(EventBus的使用(二)注解)