基于kotlin封装的EventBus,超详细介绍+完整代码! 完美解决Fragment数据传递

在这个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和越加越多的班!!!

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 18:20:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 18:20:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 18:20:01       58 阅读
  4. Python语言-面向对象

    2024-07-19 18:20:01       69 阅读

热门阅读

  1. redis时间环结构-时序特征

    2024-07-19 18:20:01       19 阅读
  2. 欢迎来到 Mint Expedition:Web3 和 NFT 的新时代开始

    2024-07-19 18:20:01       23 阅读
  3. MySQL运算符

    2024-07-19 18:20:01       22 阅读
  4. 【gradle中如何不使用插件将依赖打进jar包】

    2024-07-19 18:20:01       18 阅读
  5. web前端面向对象面试25题

    2024-07-19 18:20:01       18 阅读
  6. 【编程语言】C++和C的异同点

    2024-07-19 18:20:01       20 阅读
  7. 【React Hooks原理 - useSyncExternalStore】

    2024-07-19 18:20:01       14 阅读
  8. Ubuntu22.04:安装并配置nfs

    2024-07-19 18:20:01       19 阅读