關于事件通訊框架,相信大家比較熟悉的有這么兩個:EventBus和LiveDataBus(還有RxBus,和LiveDataBusX沒什么關系,我就略過了),EventBus是老牌的框架了,相信大家最熟悉;而LiveDataBus是最近幾年興起的框架,基于AndroidX,使用過這兩個框架的同學,我相信都能發現它們的優缺點,即便是LiveDataBus,網上很多博客都大肆的夸獎,看似毫無缺點,但是真正使用的時候,就能發現它的不足,這兩個框架我都不是很陌生,原始碼及原理我在之前的博客都有介紹,原始碼更是翻了很多遍,針對這兩個框架的缺點,開發了本章的主角---LiveDataBusX
EventBus和LiveDataBus到底有什么缺點呢?
EventBus的缺點其實還是很明顯:(1)需要管理其生命周期(2)不能定向推送事件
第一個很好理解,需要進行register和unregister,第二個什么意思呢?我舉一個例子:一個Activity中有兩個Fragment,這兩個Fragment都對TestBean這個類進行了訂閱監聽,EventBus在進行post操作時,只會發送TestBean物件,但是無法區分發送到哪個Fragment中,至于收到事件不去處理,這也是一種方法,但是并不能從根本上解決問題,
LiveDataBus即使被炒的很火,但是并不是沒有缺點:(1)使用時的代碼量略多(2)接收事件的onChange方法無法指定執行緒(3)注冊物件必須為LifecycleOwner
(注:LiveDataBus的原始碼,網上應該有很多,如果有需要的朋友,可以在留言區留言)
第一個:代碼量略多是什么鬼?看下面的代碼
LiveDataBus
.getInstance()
.with("key", TestBean.class)
.observe(this, new Observer<TestBean>() {
@Override
public void onChanged(TestBeanbean) {
...
}
有同學會說,這也不多呀!基礎代碼才7行,這么看的確不多,如果監聽10個事件呢,那么就是70行了,而EventBus出了register和unregister,基礎代碼只有3行,10個事件監聽的話,只有32行,
第二個:很顯而易見的問題,無法像EventBus一樣,指定執行緒
第三個:如果想進行事件的監聽,那么執行oberve方法的第一個引數必須是LifecycleOwner,當然這個是LiveDataBus的特點,無法解決的,
LiveDataBusX可以很好解決上面的問題(注冊物件為LifecycleOwner的問題是無法解決的)
(1)生命周期管理:LiveDataBusX是在LiveDataBus基礎上的升級,所以其生命周期管理和LiveDataBus一樣
(2)定向事件發送:可以指定key值,并且可以設定動態的key值(關于key,我們在使用的時候介紹)
(3)代碼量減少:使用方式和EventBus一樣,只有一個注冊方法,不需要解注冊,并且接收事件的方法也和EventBus一樣,使用注解的方式
(4)執行接收事件的執行緒:和EventBus一樣,在注解中指定執行緒
LiveDataBusX的使用
(1)基礎配置
在專案的buld.gradle中添加如下代碼(jcenter中沒有提交審核,所以需要添加這句,之后審核通過,這句話可以去掉)
allprojects {
repositories {
google()
jcenter()
maven {
url 'https://dl.bintray.com/codefarmerguan/LiveDataBusX'
}
}
}
在module的build.gradle中的defaultConfig中添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [
OBSERVERS_CLASS_NAME: "MyObservers",
PACKAGE_NAME : "com.gzc.app"
]
}
}
PACKAGE_NAME:這里最好填包名
OBSERVERS_CLASS_NAME:指定一個類名,之后會在Application中進行設定,這個類會通過Apt自動生成,
(2)初始化操作
在專案Application的onCreate方法中進行如下操作
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
LiveDataBusX.getInstance()
.setObservers(new MyObservers());
}
}
這里的MyObservers類就是上一步設定的OBSERVERS_CLASS_NAME的值
(3)事件監聽
在需要接收事件的類中進行observe,和EventBus的register方法一樣,不過不需要解注冊,如下
//無動態key
LiveDataBusX.getInstance().observe(this);
//有動態key
LiveDataBusX.getInstance().observe(this,dynamicKey);
observe方法有兩種:一種是無動態key,一種是有動態key,在某些業務場景下,key值可能會隨某些屬性而變化,
之后在類中寫如下的方法來接收事件變化
@Observe(threadMode = ThreadMode.MAIN,sticky = false,append = false,key = "test1")
public void test1(Test1Bean test1Bean){
}
Observe注解有四個屬性:
threadMode:指定執行緒,目前有MAIN,BACKGROUND,ASYNC三個值,和EventBus中的一樣、
sticky:是否具有粘性,和EventBus中的粘性相似,究其原理,其實和粘性沒有任何關系,執行現象和EventBus的粘性相似,我這里為了好解釋,也就使用了sticky這個值
key:靜態key
append:靜態key與動態key是否拼接,如果沒有設定動態key,這里一定要設定false,否則會出現問題
如果設定了動態key,并且append為true,最后的key形態為 靜態key::動態key
如果append為false,那么最后的key就是靜態key本身,使用者不需要關心這里的形態問題,這里只是做了解釋
(4)事件發送
LiveDataBusX.getInstance()
.post("test1",new Test1Bean());
LiveDataBusX.getInstance()
.post("test1","動態key",new Test1Bean());
post也有兩個方法,與observe的兩個方法相對應,
如果沒有動態key的情況,使用兩引數的方法:第一個引數為靜態key,第二個引數為事件物件
如果有靜態key的情況,使用三引數的方法:第一個引數為靜態key,第二個引數為動態key,第三個引數為事件物件
如果在使用上有疑問的話,大家可以在留言區留言,或者看使用示例
之后我會寫一篇LiveDataBusX的原理和流程分析,來分享我的心得
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/259763.html
標籤:其他
上一篇:swift 5 中如何使用關聯給所有Uivew子類添加tap事件
下一篇:Android 中影片的基本使用
