EventBus3.1.1 解决 Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class ... and its super classes have no public methods with the @Sub

简介:       小菜今天自己写测试 Demo 时,需要用到 EventBus,目前集成 3.1.1 版本,集成的方式很简单,在某个 Fragment 实践应用中,却一直报入下错:Caused by: org.

      小菜今天自己写测试 Demo 时,需要用到 EventBus,目前集成 3.1.1 版本,集成的方式很简单,在某个 Fragment 实践应用中,却一直报入下错:
Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.roating.ace.frag.FragmentSign and its super classes have no public methods with the @Subscribe annotation

      出问题就解决嘛,尝试如下:


  1. 检查 EventBus 集成是否添加混淆文件:
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}
  1. 检查 Fragment 中 EventBus 的注册是否正确:
@Override
protected View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    EventBus.getDefault().register(this);
    View view = inflater.inflate(R.layout.activity_sign, null);
    return view;
}
@Override
public void onDestroyView() {
    super.onDestroyView();
    EventBus.getDefault().unregister(this);
}
  1. 检查接受 Event 的方法是否添加 @Subscribe
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
void refreshSignTime(EventMessageK.SignStateME event) {
    if (event != null) {
        if (event.getType() == 1) {
            mUpTv.setText(event.getTime());
        } else {
            mDownTv.setText(event.getTime());
        }
    }
}

      乍一看应该没啥问题,但是每次都会报 its super classes have no public methods with the @Subscribe annotation,很尴尬,之后各种查网上大神解释,依然没注意问题所在,查看以前写的代码,突然醒悟,因为最近在学 Kotlin,方法定义的时候可以直接定义方法,经常省略方法权限 public/private/protected 等,意识到接收 Event 消息必须是 public 才可以,一个很简单等知识点却因为基础不扎实而浪费了很多时间,希望大家不会遇到小菜的问题。

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
fun checkLoginInfo(event: MessageEvent.LoginInfoME) {
    loginPhone = event.phone
}
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void checkLoginInfo(MessageEvent.LoginInfoME event) {
    loginPhone = event.phone
}
  下面是小菜的公众号,欢迎闲来吐槽~
小菜公众号
目录
相关文章
|
8月前
|
边缘计算 人工智能 5G
5G引领家庭网络升级:速度、稳定性与智能化的新时代
5G引领家庭网络升级:速度、稳定性与智能化的新时代
632 69
|
5月前
|
存储 缓存 开发工具
Git stash命令的详细使用说明及案例分析。
通过上述案例,我们看到stash命令能够在不丢失进度的情况下,帮助开发者临时切换开发上下文,这在处理多个任务或紧急bug时特别有用。正确使用Git stash可以大大提高开发的灵活性和效率。
1839 0
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
1150 9
|
XML Java 开发工具
在Android中使用ProgressBar显示进度
在Android中使用ProgressBar显示进度
1778 2
|
JavaScript Java Android开发
kotlin安卓在Jetpack Compose 框架下跨组件通讯EventBus
**EventBus** 是一个Android事件总线库,简化组件间通信。要使用它,首先在Gradle中添加依赖`implementation &#39;org.greenrobot:eventbus:3.3.1&#39;`。然后,可选地定义事件类如`MessageEvent`。在活动或Fragment的`onCreate`中注册订阅者,在`onDestroy`中反注册。通过`@Subscribe`注解方法处理事件,如`onMessageEvent`。发送事件使用`EventBus.getDefault().post()`。
|
Android开发
Android中如何动态的调整Dialog的背景深暗
在Android开发中,Dialog和DialogFragment可通过设置`Window`的`backgroundDimAmount`来控制背景变暗,突出对话框。在DialogFragment的`onCreateDialog`或`onViewCreated`中,获取`Dialog`的`Window`,设置`LayoutParams.dimAmount`(例如0.5f)并添加`FLAG_DIM_BEHIND`标志。要动态调整,可保存`LayoutParams`并在需要时更新。对于Dialog,创建时直接设置同样属性。还可以通过定义主题样式设置背景模糊程度。
495 7
|
Android开发 芯片
Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk
Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk
848 3
|
Android开发
无法唤起支付宝APP问题分析
商家在网页中调用支付宝提供的网页支付接口调起支付宝客户端内的支付模块,商家网页会跳转到支付宝中完成支付,支付完后跳回到商家网页内,最后展示支付结果。若无法唤起支付宝客户端,则在一定的时间后会自动进入网页支付流程。
8949 12
|
存储 Perl
STM32速成笔记(八)—DMA
本文介绍了DMA的概念,用途。对于STM32F103ZET6的DMA做出了详细地介绍,给出了DMA配置步骤。最后,以配置DMA搬运ADC转换结果为例,给出了DMA的配置和使用方法。
1061 0
STM32速成笔记(八)—DMA
|
Java 数据库连接 mybatis
一文彻底搞懂Mybatis系列(二)之mybatis事务管理机制深度剖析
一文彻底搞懂Mybatis系列(二)之mybatis事务管理机制深度剖析
1380 0