;
原因应该是:EventBus 是为已经存在的activity传递消息,而且订阅者必须要注册且不能被注销了,
如果你在onStop里面注销了,栈中虽然有这个activity,但是EventBus并没有被注册,所以也接收不到消息,
就报:No Subscribers registered 的问题
下面的话来自stackflow,很好:
In general, the EventBus is used to receive updated data for an already active activity or fragment. Think of the EventBus as more of a wrapper around an observer/consumer. For this example it looks like you are using it to pass data to another Activity.
所以有时候最好还是用标准的方法去传递相关的数据,比如bundle,在intent里面带过去
EventBus不适合向一个不存在于activity栈中的activity发送消息,这样是失败的,例如:情况1:一个activity 还没有生成,就post,肯定报这样的错;情况2:一个activity曾经生成了,但是不在activity栈中了,也是收不到消息的
1.简单介绍
事件总线这个概念对您来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解分解的目的。
我们来看看事件总线的处理流程:
事件总线就相当于一个介于发布者和订阅者中间的主轴。它隔离了出版物和订阅者之间的直接依赖,接管了所有事件的发布和订阅逻辑,并负责事件的中转。
2.实现原理
3.事件总线的实现要点
事件总线维护一个事件源与事件处理的映射字典;
通过单例模式,确保事件总线的唯一入口;
利用反射或依赖注入完成事件源与事件处理的初始化绑定;
提供统一的
http://blog.csdn.net/suwenlai/article/details/60765659
这个人只知其一不知其二这里的
this.mDispatcher.handleStickyEvent(eventType, (Object)null);
在 compile ‘org.simple:androideventbus:1.0.5.1’引入的jar包中evenbus的粘性消息源
带EventBus的改装
使用EventBus进行改造
该示例主要集中于如何使用EventBus进行改造。 该项目包含所有API句柄。 还包括一些额外的工具。 当您必须使用All API构建自己的项目时,应该考虑该示例项目。
可能会发现这种结构有点复杂,但是一旦习惯了,实现API只需几分钟。
创建的应用程序和API
由于公司的项目均采用运行于基于Ubuntu 16.04的Docker之上,所以之前的.Net Framework下的方案均不可用,而因为并未提供基于
的SDK,所以在结合诸多开源项目以及我们自己的实际需求之后通过改写从而诞生了该库。
1. 配置
打开appsettings.json并增加如下配置信息:
"EventBus": {
"Username": "guest",
"Password": "guest",
"VirtualHost": "/",
"Port": 5672,
"Hostnames": [ "localhost" ],
"PublishConfirmTimeout": "00:00:01",
"RecoveryInterval": "00:00:10",
"PersistentDeli
在使用EventBus的时候出现这样的debug提示,
一般的原因就是,post 把消息发送过去了,activity 还没有创建完成, 或者activity栈中没有activity 这个跟设置了启动模式有关
处理方法就是,activity没有收到post的消息,就一直发送直到接受到消息为止。
一直发送消息,当然要使用粘性发送消息的方式,
使用postSticky , 接收消息设置stick...
在最近的项目中使用EventBus代替广播,intent传递消息等,大大减少了代码量,提升编码速度,同时整体的代码优雅型也提高了。
使用过程中遇到一些小问题,就是在当前activity使用EventBus.getInstance().post(new Test(“eventbus发送消息成功!”));然后在onCreate中EventBus.getIntsance().register(this);
@Subscribs(threadMode = ThreadMode.MAIN)
public void o
GitHub - greenrobot/EventBus: Event bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality.https://github.com/greenrobot/EventBus 1、配置gradle,导入依赖
2、定义Event类型(
在理清原理之前,先要明白EventBus的使用场景和主要方法的调用,可以参考EventBus 3.0的使用。
Publish/Subscribe模式,就是发布订阅模式。点击在线查看EventBus.java源码。EventBus的核心思想就是把event和订阅者,对应存在一个HashMap中,post方法调用后,再根据入参event,从HashMap中取出对应的订阅者对象,调用订阅方法,完成通信。
下面逐步分析EventBus的几个重要方法。
getDefault()使用单例模式新建唯一单例EventBu.
1.No subscribers registered for event class
EventBus不适合向一个不存在于activity栈中的activity发送消息,这样是失败的.
情况1:一个activity 还没有生成,就post,肯定报这样的错;
情况2:一个activity曾经生成了,但是不在activity栈中了,也是收不到消息的
情况3:生命周期的问题
官方推荐是这样...
acitivity里的onstart注册事件EventBus.getDefault().register(this);service里有个子线程里post了一个xxxEvent实例,在activity里使用了public void onEventMainThread(xxxEvent event){}
问题来了,都...
1.直接闪退,报类型转换错误,检查很多遍,无果,最后发现,是因为采用了多个布局适配,也就是layout-sw600dp和layout文件夹下有一个相同命名的布局文件,后来因为需求变化,更改了其中一个布局文件的控件类型,另一个忘了改,编译没有报错,运行时报错
2.startActivity启动一个新Activity后onActivityResult不被调用,但是有时候又会被调用,找了很久,发现是因为使
EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件。事件传递既可用于 Android 四大组件间通讯,也可以用户异步线程和主线程间通讯等等。EventBus
EventBus3.0版本有较大的更新,性能上有很大提升。这里只介绍新版本。
传统的事件传递方式包括:Handler
这句子的话意思也很容易理解,“接收者类已经被注册为事件类了”。之前我是这么写:
事件注册是写在onStart()里面的@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}来看一下Activity的生命周期: