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,不然的话就可以使用其他的线程,消息处理也是根据订阅者顺序来的,不注册订阅者就无法收到消息
然后又有一个问题来了?我忘记注册了订阅者等我都把消息发送了才知道需要注册,这个时候我需要收到消息怎么办?关于这个问题,我们到下一讲继续,这一讲有点绕,希望大家多多敲代码理解消化下。
- EventBus 3.0(三)
- EventBus 源码试读(三)
- EventBus(三)-----从post这条线分析EventBus
- EventBus 3.0
- 框架(三) 、eventbus 介绍l
- android EventBus详解(三)
- EventBus学习笔记(三)
- EventBus(三)---Fragment案例通讯应用
- AsyncTask,Handler,EventBus三者的对比
- EventBus 3使用文档(三)
- EventBus的使用(三)粘性事件
- Android EventBus 3.0 框架
- EventBus 3.0变化
- EventBus 3.0 使用详解
- Eventbus 3.0 使用
- EventBus 3.0使用详解
- EventBus 3.0 (一) 基础
- EventBus 3.0使用基础
- 阿里、网易、滴滴共十次前端面试碰到的问题
- FreeMarker
- 智能预言机:一种简单、强大的执行智能合同的方法
- 百度地图API之环境搭建
- 字符串链接函数 CONCAT_WS CONCAT
- EventBus 3.0(三)
- MySQL 使用while语句向数据表中批量插入数据
- week 2
- spark清洗离线数据
- 6月13日--元组传参、pageobject
- 发送手机短信代码
- 快速排序 快速搞定
- Log4 日志配置文件
- SSM环境搭建