• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

android——通信传值:LiveDataBus、Flowbus

武飞扬头像
wy313622821
帮助1

问大家一个问题:

Activity之间进行通信你现在使用的是什么?

大家第一印象中Activity之间进行通信是否还是:Intent , Handler,EventBus , RxBus ,广播。

如果你还在用上面说的这些,那你的技术还停留在老旧和原始的技术上,现在技术从LiveData中延伸出 LiveDataBus ,用谷歌的原话

从18年谷歌IO大会开始 官方建议:
在Activity与Activity ,Activity与Fragment,Fragment与Fragment之间通信使用LivedataBus。

1、Activity之间进行通信(LiveDataBus)

下面进入代码:

  1.  
    /**
  2.  
    * 这条总线用于把任何类中的数据直接传递到activity或是fragment上
  3.  
    */
  4.  
    class LiveDataBus private constructor() {
  5.  
    //存放订阅者
  6.  
    private val bus: MutableMap<String, MutableLiveData<Any>>
  7.  
     
  8.  
    init {
  9.  
    bus = HashMap()
  10.  
    }
  11.  
     
  12.  
    //注册订阅者,(存入map)
  13.  
    @Synchronized
  14.  
    fun <T> with(key: String, type: Class<T>?): MutableLiveData<T> {
  15.  
    if (!bus.containsKey(key)) {
  16.  
    bus[key] = MutableLiveData()
  17.  
    }
  18.  
    return bus[key] as MutableLiveData<T>
  19.  
    }
  20.  
     
  21.  
    companion object {
  22.  
    val instance = LiveDataBus()
  23.  
    }
  24.  
    }

使用:

发送

LiveDataBus.instance.with("first", String::class.java).postValue("数据111")

接收

  1.  
    LiveDataBus.instance.with("first", String::class.java).observe(this) {
  2.  
    Log.e("TAG", "接收到数据为:$it")
  3.  
    }

LiveDataBus 与 EventBus、RxBus的 比较

LiveDataBus 与 EventBus 的比较:

LiveDataBus的实现及其简单,相对EventBus复杂的实现,LiveDataBus只需要一个类就可以实

LiveDataBus 与 RxBus 的比较:

LiveDataBus可以减小APK包的大小 并且 依赖支持也更好。因为 LiveDataBus只依赖Android官方组件LiveData,本身实现只一个类。而RxBus需要依赖RxJava和RxAndroid。

最后还有一点 LiveDataBus具有生命周期感知。
在Android系统中使用调用者不需要调用反注册,相比EventBus和RxBus使用更为方便,并且没有内存泄漏风险

2、通信之FlowBus

请看本人另外一篇文章:

实际项目中的运用


问题:在baseActivity中使用,AActivity和BActivity都继承baseActivity,如果都使用同一个key,则AActivity中post值,在AActivity和BActivity都会触发,因为AActivity和BActivity都是继承baseActivity
怎么解决呢?
baseActivity中使用this.tostring()作为key
在post的activity中使用this.tostring()作为key就可以了
如果不是在activity中post值的话,可以获取当前运行的顶层 Activity再使用

学新通

学新通

上述问题的出现场景:网络请求,失败了都弹一个弹窗提示,当前最顶层的Activity弹出即可,其他的Activity不要弹

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgccejk
系列文章
更多 icon
同类精品
更多 icon
继续加载