Android使用Eventbus 3+意想不到的坑(全局监听事件并弹框)

在项目中很多通讯都使用eventbus,相信大家对eventbus的基本使用都非常熟练了,首先简单说下eventbus的使用步骤(依赖就忽略了):

1.在使用的类中注册:

EventBus.getDefault().register();

2.注册后需要进行订阅事件:

@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void doSubscribe(EventBusData eventBusData) {

}

这里需要注意在注解中,指定事件的线程可以是主线程可以是子线程,并且配置是否粘性事件,默认值是false,这里设置成true,(粘性事件简单来说就是可以先发送事件,然后再注册订阅消息)。另外在处理事件的方法必须是public修饰符

3.发送事件

EventBus.getDefault().post(new EventBusData(msg, 0, "textmsg"));

发送了一个EventbusData并且有对应的标识的消息,另外我们在接收事件对象也必须是EventbusData,然后判断flag是否"textmsg"就能保证消息唯一性,也比较方便维护

4.取消注册

取消注册需要注意的是在类回收或者销毁的时候进行取消否则会报错

上面四部基本上就能满足项目中通讯了,但是前段时间遇到个需求:

开启个Service,在Service有个第三方SDK回调监听方法,监听到回调就发送消息,然后App需要在当前界面弹框。这个需求看起来并不难首先既然是App所有页面都要监听消息,那么最好就是在BaseActivity里面实现消息监听处理,另外一个重点就是判断当前栈顶activity就是当前显示界面的activity。ok我们现在baseactivity注册监听:

oncreate方法里面注册:

订阅事件:

发送事件:

EventBus.getDefault().post(new EventBusData<>(System.currentTimeMillis(), 0, "logoutchat"));

我们看下日志:

这个日志是从主页面MainActivity跳转到NewpatientListActivity的,然后在NewpatientListActivity的时候Service发送消息,但是通过getClass().getName()获取的始终是MainActivity(正常情况应该是NewpatientListActivity)而通过获取栈顶的方法确是NewpatientListActivity。这样导致无法仅仅在当前页面进行弹框了。因为我无法判断App是否在当前页面,怎么办呐?在网上找了一些文章于是有点其他想法了,首先肯定还是得在baseactivity里面做,创建一个内部类

这样getClass().getName()获取的类名就正常了,从而可以判断App是否在当前界面并且仅在当前界面弹框。至于之前的方案为什么不行,还是无法理解。希望路过的大神可以指点迷津...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值