在这个kotlin蒸蒸日上的时代,只用java去进行Android开发,显得如此不合时代。
本程序员近日也遇到一些问题,在进行fragment的数据传递时屡屡出错,(怎一个苦字了得)好在最后使用EventBus完美解决,于是决定发布此文,解决同僚相似问题。
概要
EventBus基于观察者模式,将事件的接收者和发送者分开,简化了组件之间的通信操作,使用简单,效率高,体积小。
这里放一张从网友那里借来的图,帮助大家理解(你我之间,怎能以偷字概之?)
整体架构流程
1.首先,需要封装注解。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Event {
String value();
}
val bus by lazy {
MutableLiveData<Pair<String,Any?>>()
}
2.然后,在需要接收事件实例化他(这里推荐用在封装框架上,实现实例一次,无限复用),用注解去注册事件订阅方法。
private fun observable() {
val methods = javaClass.declaredMethods
for (method in methods){
val event = method.getAnnotation(Event::class.java)
if(event != null){
bus.observe(this){
if(it.first == event.value){
method.invoke(this,it.second)
}
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
observable()
initData()
initView()
}
这里是注册以及需要传递的数据,具体就不展示了,大家按需自行处理
bus.postValue("getAdapterSize" to adapter.data.size)
@Event("getAdapterSize")
fun getAdapterSize(n: Int) {
val badge = binding.navView.getOrCreateBadge(R.id.navigation_home)
badge.number = n
badge.isVisible = badge.number != 0
}
3.最后,将处理完成的数据发送出去。
技术名词解释
- @Target(ElementType.METHOD)指定该注解可以应用于方法上。
- @Retention(RetentionPolicy.RUNTIME) 指定该注解在运行时仍然有效,可以被反射机制读取
技术细节
这里自定义注解Event使用的是java代码,基于livedata去实现,使用kotlin会有一些小问题,因为并不要求纯血kotlin,因此就使用了java的自定义注解。方法的实现并不一定,各位同僚不妨想想如何用Rxjava去对他进行二次封装,提高性能
小结
eventbus的使用场景可以实现fragment和activity之间的传值,eventbus可以发送粘性事件(不需要提前注册,后注册也可以接受到消息)。望天下再无越修越多的bug和越加越多的班!!!