LiveDataBus

Introduction: Android 消息总线,基于 LiveData,具有生命周期感知能力
More: Author   ReportBugs   
Tags:

Android 消息总线,基于 LiveData,具有生命周期感知能力,支持 Sticky

license version

简单之美

LiveEventBus实现非常简单,功能却非常强大。简单好用,就是最好的:)

LiveEventBus 的特点

  • [x] 生命周期感知,消息随时订阅,自动取消订阅
  • [x] 支持 Sticky 粘性消息
  • [x] 支持设置 LifecycleObserver(如 Activity)接收消息的模式:
  • 整个生命周期(从 onCreate 到 onDestroy)都可以实时收到消息
  • 激活状态(Started)可以实时收到消息,非激活状态(Stoped)无法实时收到消息,需等到 Activity 重新变成激活状态,方可收到消息

在工程中引用

Via Gradle:

implementation 'com.jeremyliao:live-event-bus:1.2.1'

调用方式

订阅消息

  • observe 生命周期感知,不需要手动取消订阅
LiveEventBus.get()
    .with("key_name", String.class)
    .observe(this, new Observer<String>() {
        @Override
        public void onChanged(@Nullable String s) {
        }
    });
  • observeForever 需要手动取消订阅
LiveEventBus.get()
    .with("key_name", String.class)
    .observeForever(observer);
LiveEventBus.get()
    .with("key_name", String.class)
    .removeObserver(observer);

发送消息

  • setValue 在主线程发送消息
    LiveEventBus.get().with("key_name").setValue(value);
    
  • postValue 在后台线程发送消息,订阅者会在主线程收到消息

    LiveEventBus.get().with("key_name").postValue(value);
    

    Sticky 模式

    支持在注册订阅者���时候设置 Sticky 模式,这样订阅者可以接收到订阅之前发送的消息

  • observeSticky 生命周期感知,不需要手动取消订阅,Sticky 模式

LiveEventBus.get()
        .with("sticky_key", String.class)
        .observeSticky(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s){
            }
        });
  • observeStickyForever 需要手动取消订阅,Sticky 模式
LiveEventBus.get()
        .with("sticky_key", String.class)
        .observeStickyForever(observer);
LiveEventBus.get()
        .with("sticky_key", String.class)
        .removeObserver(observer);

设置 LifecycleObserver 接收消息的模式

  • [x] 整个生命周期(从 onCreate 到 onDestroy)都可以实时收到消息(LiveEventBus 的默认设置)
LiveEventBus.get().lifecycleObserverAlwaysActive(true);
  • [x] 激活状态(Started)可以实时收到消息,非激活状态(Stoped)无法实时收到消息,需等到 Activity 重新变成激活状态,方可收到消息
LiveEventBus.get().lifecycleObserverAlwaysActive(false);

混淆规则

-dontwarn android.arch.lifecycle.LiveData
-keep class android.arch.lifecycle.LiveData { *; }
-keep class android.arch.lifecycle.LifecycleRegistry { *; }
-keep class android.arch.core.internal.SafeIterableMap { *; }

其他版本

classic

  • [x] 经典实现版,整个实现就一个 java 文件
  • [x] 只支持激活状态(Started)可以实时收到消息,非激活状态(Stoped)无法实时收到消息,需等到 Activity 重新变成激活状态,方可收到消息

v2

  • [x] v2 版,所有特性同 master 版保持一致
  • [x] 为了解决非激活态不能实时收到消息的问题,采用修改 LiveData 源码的方式实现,master 版采用继承 LiveData 的方式实现

示例和 DEMO

  • [x] 发送、接收消息
  • [x] Sticky 模式

基本功能 sticky

  • [x] 任何时候都可以订阅消息
  • [x] 一个简单的应用场景,发消息关闭所有 Activity

register close all

  • [x] 快速 postValue 也不会丢失消息
  • [x] 整个生命周期(从 onCreate 到 onDestroy)都可以实时收到消息

postvalue always

文档

LiveEventBus 实现原理

LiveEventBus 的实现原理可参见作者在美团技术博客上的博文: Android 消息总线的演进之路:用 LiveDataBus���代 RxBus、EventBus

质量

  • [x] 编写了 14 个测试用例以确保 LiveEventBus 能够正常运行。
  • [x] 具体测试用例参见LiveEventBusTest

主要功能 Commit 记录

  1. 主要功能完成(Jul 11, 2018)
  2. 支持 Sticky(Aug 8, 2018)
  3. 修复在后台线程 PostValue 会丢失消息的问题(Aug 9, 2018)
  4. 解决发送给 Stop 状态 Observer 消息无法及时收到的问题(Aug 18, 2018)
  5. 解决了 Resumed 状态的 Activity 发生订阅,订阅者会收到订阅之前发布的消息的问题。特别感谢@MelonWXD 发现了这个问题(Dec 8,2018)
  6. 在 removeObserver 的时候,检查 livedata 上有没有 observer,没有则删除这个 livadata,以减少内存占用。特别感谢@GreenhairTurtle 提供的解决方案(Dec 27,2018)
  7. 支持设置 LifecycleObserver 接收消息的模式,支持在整个生命周期实时接收消息和只在激活态实时接收消息两种模式(Jan 22,2019)

其他

  • 欢迎提 Issue 与作者交流
  • 欢迎提 Pull request,帮助 fix bug,增加新的 feature,让 LiveEventBus 变得更强大、更好用

More Open Source by JeremyLiao

  1. FastSharedPreferences 一个 Android 平台的高性能 key-value 组件
  2. tensorflow-lite-sdk 一个更加通用的 Tensorflow-Lite Android SDK
  3. android-modular 一个组件化实施方案的 Demo
  4. MessageBus 一个 android 平台的基于订阅-发布模式的消息框架,支持跨进程消息通信
  5. persistence 一个 android 平台的 key-value storage framework
  6. LightRxAndroid 另辟蹊径,利用 Android Handler 实现了一个类似 RxJava 的链式框架
  7. rxjava-retry 封装了几个处理 RxJava Retry 操作的类
  8. retrofit-mock 一个用于 Retrofit mock response 数据的工具
  9. jacoco-android-demo AndroidStudio 运行 jacoco 计算测试覆盖率的 Demo
  10. android-gradle-study 深入浅出 Android Gradle
Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea