Andoird中LiveEventBus的使用——用LiveEventBus替代RxBus、EventBus

Github:https://github.com/JeremyLiao/LiveEventBus

一、集成方法
1、在主model的build中加入:

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

2、在Application的onCreat中加入:

/**
 * 初始化LiveEventBus
 * 1、supportBroadcast配置支持跨進程、跨APP通信
 * 2、配置LifecycleObserver(如Activity)接收消息的模式(默認值true):
 * true:整個生命週期(從onCreate到onDestroy)都可以實時收到消息
 * false:激活狀態(Started)可以實時收到消息,非激活狀態(Stoped)無法實時收到消息,需等到Activity重新變成激活狀		    
 * 態,方可收到消息
 * 3、autoClear
* 配置在沒有Observer關聯的時候是否自動清除LiveEvent以釋放內存(默認值false)
* */

LiveEventBus.
    config().
    supportBroadcast(this).
    lifecycleObserverAlwaysActive(true).
    autoClear(false);

二、使用方法
1、發送消息
在需要發送消息的地方
1)、
//發送一條即時消息

LiveEventBus.get("key").post("value");

2)、
//發送一條延時消息 3秒跳轉

LiveEventBus.get("key").postDelay("value",3000);

2、接受消息,註冊一個訂閱
在需要接受消息的地方

LiveEventBus.get("key",String.class).observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
    Log.i(TAG,s);
}
});

當發送key這條消息的時候,就會實時接收到消息 ,前提頁面沒有銷燬,因爲具有生命週期感知能力

介紹和優點

介紹

LiveData是Android Architecture Components提出的框架。LiveData是一個可以被觀察的數據持有類,它可以感知並遵循Activity、Fragment或Service等組件的生命週期。正是由於LiveData對組件生命週期可感知特點,因此可以做到僅在組件處於生命週期的激活狀態時才更新UI數據。
LiveData需要一個觀察者對象,一般是Observer類的具體實現。當觀察者的生命週期處於STARTED或RESUMED狀態時,LiveData會通知觀察者數據變化;在觀察者處於其他狀態時,即使LiveData的數據變化了,也不會通知。
LiveData的優點
UI和實時數據保持一致,因爲LiveData採用的是觀察者模式,這樣一來就可以在數據發生改變時獲得通知,更新UI。
避免內存泄漏,觀察者被綁定到組件的生命週期上,當被綁定的組件銷燬(destroy)時,觀察者會立刻自動清理自身的數據。
不會再產生由於Activity處於stop狀態而引起的崩潰,例如:當Activity處於後臺狀態時,是不會收到LiveData的任何事件的。
不需要再解決生命週期帶來的問題,LiveData可以感知被綁定的組件的生命週期,只有在活躍狀態纔會通知數據變化。
實時數據刷新,當組件處於活躍狀態或者從不活躍狀態到活躍狀態時總是能收到最新的數據。
解決Configuration Change問題,在屏幕發生旋轉或者被回收再次啓動,立刻就能收到最新的數據。
談一談Android Architecture Components
Android Architecture Components的核心是Lifecycle、LiveData、ViewModel 以及 Room,通過它可以非常優雅的讓數據與界面進行交互,並做一些持久化的操作,高度解耦,自動管理生命週期,而且不用擔心內存泄漏的問題。
Room
一個強大的SQLite對象映射庫。
ViewModel
一類對象,它用於爲UI組件提供數據,在設備配置發生變更時依舊可以存活。
LiveData 一個可感知生命週期、可被觀察的數據容器,它可以存儲數據,還會在數據發生改變時進行提醒。
Lifecycle
包含LifeCycleOwer和LifecycleObserver,分別是生命週期所有者和生命週期感知者。
Android Architecture Components的特點
數據驅動型編程
變化的永遠是數據,界面無需更改。
感知生命週期,防止內存泄漏
高度解耦
數據,界面高度分離。
數據持久化
數據、ViewModel不與 UI的生命週期掛鉤,不會因爲界面的重建而銷燬。
重點:爲什麼使用LiveData構建數據通信總線LiveDataBus
使用LiveData的理由
LiveData具有的這種可觀察性和生命週期感知的能力,使其非常適合作爲Android通信總線的基礎構件。
使用者不用顯示調用反註冊方法。
由於LiveData具有生命週期感知能力,所以LiveDataBus只需要調用註冊回調方法,而不需要顯示的調用反註冊方法。這樣帶來的好處不僅可以編寫更少的代碼,而且可以完全杜絕其他通信總線類框架(如EventBus、RxBus)忘記調用反註冊所帶來的內存泄漏的風險。
爲什麼要用LiveDataBus替代EventBus和RxBus
LiveDataBus的實現及其簡單,相對EventBus複雜的實現,LiveDataBus只需要一個類就可以實現。
LiveDataBus可以減小APK包的大小,由於LiveDataBus只依賴Android官方Android Architecture Components組件的LiveData,沒有其他依賴,本身實現只有一個類。作爲比較,EventBus JAR包大小爲57kb,RxBus依賴RxJava和RxAndroid,其中RxJava2包大小2.2MB,RxJava1包大小1.1MB,RxAndroid包大小9kb。使用LiveDataBus可以大大減小APK包的大小。
LiveDataBus依賴方支持更好,LiveDataBus只依賴Android官方Android Architecture Components組件的LiveData,相比RxBus依賴的RxJava和RxAndroid,依賴方支持更好。
LiveDataBus具有生命週期感知,LiveDataBus具有生命週期感知,在Android系統中使用調用者不需要調用反註冊,相比EventBus和RxBus使用更爲方便,並且沒有內存泄漏風險。
LiveDataBus的設計和架構
LiveDataBus的組成

消息
消息可以是任何的Object,可以定義不同類型的消息,如Boolean、String。也可以定義自定義類型的消息。
消息通道
LiveData扮演了消息通道的角色,不同的消息通道用不同的名字區分,名字是String類型的,可以通過名字獲取到一個LiveData消息通道。
消息總線
消息總線通過單例實現,不同的消息通道存放在一個HashMap中。
訂閱
訂閱者通過getChannel獲取消息通道,然後調用observe訂閱這個通道的消息。
發佈
發佈者通過getChannel獲取消息通道,然後調用setValue或者postValue發佈消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章