EventBus 3.0(三)

来源:互联网 发布:私有属性 js velocity 编辑:程序博客网 时间:2024/05/08 20:57

我们紧接着上一讲,如何理解@Subscribe注解?这个东西怎么使用?

1 同一组件中

我们重新使用上一讲的案例,这里修改下把A1里面的注解都写上

 @Subscribe(threadMode = ThreadMode.MAIN)    public void hello(String s){        thread = Thread.currentThread();        Log.i("TAG", "MAIN:"+thread.getName()+""+thread.getPriority());        textView.setText(s);    }    @Subscribe(threadMode = ThreadMode.POSTING)    public void hello1(String s){        thread = Thread.currentThread();        Log.i("TAG", "POSTING:"+thread.getName()+""+thread.getPriority());    }    @Subscribe(threadMode = ThreadMode.BACKGROUND)    public void hello2(String s){        thread = Thread.currentThread();        Log.i("TAG", "BACKGROUND:"+thread.getName()+""+thread.getPriority());    }    @Subscribe(threadMode = ThreadMode.ASYNC)    public void hello3(String s){        thread = Thread.currentThread();        Log.i("TAG", "ASYNC:"+thread.getName()+""+thread.getPriority());    }

点击“Intent传值”按钮结果

这里写图片描述

Intent传值是运行在主线程的,所以POSTING就显示在main线程,BACKGROUND发现发送消息的线程是主线程,所以自己新开了线程,ASNC表示我不管你们在什么线程收发消息,我都要新开线程处理

点击“网络请求”按钮结果

这里写图片描述

执行网络请求是在子线程中进行的,所以POSTING就在子线程中进行的,BACKGROUND发现执行函数不在主线程进行所以很开心,就在当前线程处理就好了,至于ASNC则不管这些,继续新建线程

注意

  注解的执行顺序和POST消息所在线程有很大关系,如果是在主线程中进行,那么就先执行MAIN再执行POSTING;如果是在子线程中进行就先执行POSTING和BACKGROUND

2 不同组件中

如果现在需求改变,两个Activty都注册了订阅者,也就是说两个Activity中都可以接收消息,但是在其中一个A中发送消息,那么两个A谁先收到呢?

从A1跳转到A2

//A1中代码如下 @Subscribe(threadMode = ThreadMode.POSTING)    public void hello1(String s){        Log.i("TAG", "POSTING1");    }
//A2中代码 @Subscribe(threadMode = ThreadMode.POSTING)     public void heelo(String  s) {         Log.i("TAG", "POSTING2");     }

结果A1中的方法优先于A2执行

这里写图片描述

从A2跳转到A1

这里写图片描述

结果很明显,就是只有A2的订阅者收到了消息,A1对此没有任何反馈,为什么?我们不得不再提到消息/订阅模式,这种模式重点在于先注册订阅者,只有当订阅者已经存在的情况下,在任何地方发送消息才会接收到,因为你首先打开的是A2,只在A2中注册了订阅者,所以只能A2处理消息

总结

谁先注册订阅者,谁先接收并处理消息

不注册订阅者,就收不到消息也处理不了

欲言又止

关于这一讲就到这里啦,大家注意这四个注解的调用线程就好,注意修改UI线程就是MAIN,不然的话就可以使用其他的线程,消息处理也是根据订阅者顺序来的,不注册订阅者就无法收到消息

然后又有一个问题来了?我忘记注册了订阅者等我都把消息发送了才知道需要注册,这个时候我需要收到消息怎么办?关于这个问题,我们到下一讲继续,这一讲有点绕,希望大家多多敲代码理解消化下。

原创粉丝点击