EventBus简介
EventBus是一种用于Android的事件发布-订阅总线。他简化了应用程序内各个组件之间进行通信的复杂度。
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
EventBus使用步骤
1、配置gradle,导入依赖
implementation 'org.greenrobot:eventbus:3.3.1'
2、定义Event类型(非必须)
package com.example.eventbusdemo
data class MessageEvent(val name: String) {
}
3、注册、注销EventBus
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//注册订阅者
//避免重复注册,重复注册会导致崩溃
if (!EventBus.getDefault().isRegistered(this)) { //这里的取反别忘记了
EventBus.getDefault().register(this)
} else {
println("请勿重复注册事件")
}
}
override fun onDestroy() {
super.onDestroy()
//注销订阅者
EventBus.getDefault().unregister(this)
}
4、定义事件处理订阅者
//准备接受事件的订阅者
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: MessageEvent) {
println(event.name)
}
5、创建并发送消息
fun sendEvent(v: View) {
EventBus.getDefault().post(MessageEvent("我来自第二个页面"))
}
我在项目中,在JS接口中,发送EventBus消息
代码如下
// JavaScript 接口类 class WebAppInterface(private val context: Context) { init { //注册订阅者 //避免重复注册,重复注册会导致崩溃 if (!EventBus.getDefault().isRegistered(this)) { //这里的取反别忘记了 EventBus.getDefault().register(this) } else { Log.i("xudong debug", "请勿重复注册事件, from Composable WebView") } } threadMode = ThreadMode.MAIN) ( fun onMessageEvent(event: MessageEvent) { // 处理事件 Log.i("xudong debug", "监听者 webview interface, received message: ${event}") } fun playAudio(message: String) { Toast.makeText(context, "playAudio: $message", Toast.LENGTH_SHORT).show() EventBus.getDefault().post(MessageEvent("playAudio", message)) } fun stopAudio() { Toast.makeText(context, "stopAudio", Toast.LENGTH_SHORT).show() EventBus.getDefault().post(MessageEvent("stopAudio")) } }
在播放器里,监听事件,调用播放器实例中的方法
//准备接受事件的订阅者 threadMode = ThreadMode.MAIN) ( fun onMessageEvent(event: MessageEvent) { Log.i("xudong debug", "监听者AudioPlay 收到消息: ${event.name}, key1: ${event.key1}") if(event.name == "playAudio") { this.play() } if(event.name == "stopAudio") { this.stop() } }