内容简介:这里的示例我用了自己的基类和类主页,显示EventBusActivity,我们首先订阅事件。然后跳转到SecondActivity发送事件。 EventBus基本用法就是先建立消息事件类,然后注册事件,在Activity中注意最后要取消订阅。然后建立事件订阅者处理事件,要注意线程模式。最后通过事件发布者发布事件,一般使用 EventBus.getDefault().post()发布。如果遇到在发布事件后还没有注册事件的情况,就使用粘性事件处理。
这里的示例我用了自己的基类和类 ARouter 的路由通信,基本大同小异,只需要注意EventBus的用法就好。
-
在项目的build.gradle中添加配置:
implementation 'org.greenrobot:eventbus:3.1.1' 复制代码
-
添加消息事件类:
class MessageEvent internal constructor(message: String) { private var message: String? = null init { this.message = message } internal fun getMessage(): String? { return message } fun setMessage(message: String) { this.message = message } } 复制代码
-
事件的注册和取消订阅
class EventBusActivity : BaseActivity<BasePresenter>(){ val Tag = "EventBusActivity" override fun initWidgets() { tv_message.text = getString(R.string.EventBusActivity) btn_subscription.text = getString(R.string.subscriptionEvent) btn_message.text = getString(R.string.jumpToSecond) } override fun setListeners() { click(btn_message,btn_subscription) } override fun onWidgetsClick(v: View) { when(v){ //RegisteredEvent btn_subscription ->{ if (!EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().register(this) }else{ showToast(getString(R.string.repeatRegistration)) } } btn_message ->{ goActivity(Paths.DemoPage.SecondActivity) } } } override fun bindLayout() = R.layout.activity_eventbus override fun onDestroy() { super.onDestroy() //取消注册事件 EventBus.getDefault().unregister(this) } 复制代码
-
事件订阅者处理事件
@Subscribe(threadMode = ThreadMode.MAIN) fun Event(messageEvent: MessageEvent) { tv_message.text = messageEvent.getMessage() } 复制代码
-
发布事件
class SecondActivity :BaseActivity<BasePresenter>(){ override fun initWidgets() { tv_message.text = getString(R.string.SecondActivity) btn_subscription.text = getString(R.string.sendStickyEvents) btn_message.text = getString(R.string.sendEvent) } override fun setListeners() { click(btn_message,btn_subscription) } override fun onWidgetsClick(v: View) { when(v){ btn_message ->{ EventBus.getDefault().post(MessageEvent(getString(R.string.wish))) finish() } btn_subscription ->{ EventBus.getDefault().postSticky(MessageEvent(getString(R.string.stickyEvents))) finish() } } } override fun bindLayout() = R.layout.activity_eventbus } 复制代码
-
粘性事件
EventBus的粘性事件与粘性广播类似,就是发送了事件之后再次订阅该事件也能收到。
@Subscribe(sticky = true) fun StickyEvent(messageEvent: MessageEvent) { tv_message.text = messageEvent.getMessage() } 复制代码
订阅粘性事件与上面相同,发送粘性事件在上面的代码中有。
效果示例
主页,显示EventBusActivity,我们首先订阅事件。然后跳转到SecondActivity发送事件。 点击发送事件 接下来测试粘性事件,首先我们先不订阅事件,先跳转到SecondActivity,点击发送粘性事件。然后我们发现字样并没有变化。 这个时候我们订阅事件,会发现字样改变。
最后总结
EventBus基本用法就是先建立消息事件类,然后注册事件,在Activity中注意最后要取消订阅。然后建立事件订阅者处理事件,要注意线程模式。最后通过事件发布者发布事件,一般使用 EventBus.getDefault().post()发布。如果遇到在发布事件后还没有注册事件的情况,就使用粘性事件处理。
用法详解就到这里了,作为一个渴求真相的小程序员,我在之后还要继续在原理上探索EventBus是如何实现的,到时候如果有什么心得也会随时记录。这是我第一次总结第三方框架使用,如有不妥欢迎指正。另外我的 个人总结demo 已经同步更新了,如果博文有不详细的地方可以通过demo进一步理解。
以上所述就是小编给大家介绍的《Android探索与巩固(Kotlin下的EventBus)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Android探索与巩固(微信QQ第三方登陆填坑)
- Python 基础巩固:位运算的奥妙
- 重新巩固JS(三)——JavaScript语句
- 重新巩固JS(一)——JavaScript基本类型
- TCP协议灵魂之问,巩固你的网路底层基础
- 重新巩固JS(二)——JavaScript操作符与表达式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。