当前位置:   article > 正文

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

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

在这个kotlin蒸蒸日上的时代,只用java去进行Android开发,显得如此不合时代。 

本程序员近日也遇到一些问题,在进行fragment的数据传递时屡屡出错,(怎一个苦字了得)好在最后使用EventBus完美解决,于是决定发布此文,解决同僚相似问题。

概要

EventBus基于观察者模式,将事件的接收者和发送者分开,简化了组件之间的通信操作,使用简单,效率高,体积小。

这里放一张从网友那里借来的图,帮助大家理解(你我之间,怎能以偷字概之?)

整体架构流程

1.首先,需要封装注解。

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface Event {
  4. String value();
  5. }
  1. val bus by lazy {
  2. MutableLiveData<Pair<String,Any?>>()
  3. }

2.然后,在需要接收事件实例化他(这里推荐用在封装框架上,实现实例一次,无限复用),用注解去注册事件订阅方法。

  1. private fun observable() {
  2. val methods = javaClass.declaredMethods
  3. for (method in methods){
  4. val event = method.getAnnotation(Event::class.java)
  5. if(event != null){
  6. bus.observe(this){
  7. if(it.first == event.value){
  8. method.invoke(this,it.second)
  9. }
  10. }
  11. }
  12. }
  13. }

  1. override fun onCreate(savedInstanceState: Bundle?) {
  2. super.onCreate(savedInstanceState)
  3. setContentView(binding.root)
  4. observable()
  5. initData()
  6. initView()
  7. }

这里是注册以及需要传递的数据,具体就不展示了,大家按需自行处理

bus.postValue("getAdapterSize" to adapter.data.size)

  1. @Event("getAdapterSize")
  2. fun getAdapterSize(n: Int) {
  3. val badge = binding.navView.getOrCreateBadge(R.id.navigation_home)
  4. badge.number = n
  5. badge.isVisible = badge.number != 0
  6. }

3.最后,将处理完成的数据发送出去。

技术名词解释

  •  @Target(ElementType.METHOD)指定该注解可以应用于方法上。
  • @Retention(RetentionPolicy.RUNTIME) 指定该注解在运行时仍然有效,可以被反射机制读取

技术细节

这里自定义注解Event使用的是java代码,基于livedata去实现,使用kotlin会有一些小问题,因为并不要求纯血kotlin,因此就使用了java的自定义注解。方法的实现并不一定,各位同僚不妨想想如何用Rxjava去对他进行二次封装,提高性能

小结

eventbus的使用场景可以实现fragment和activity之间的传值,eventbus可以发送粘性事件(不需要提前注册,后注册也可以接受到消息)。望天下再无越修越多的bug和越加越多的班!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/898914
推荐阅读
相关标签
  

闽ICP备14008679号