EventBus可以輕鬆實現跨組件、跨線程的數據通信,相對於傳統四大組件之一的BroadcastReciver來說,使用更爲方便、輕巧、代碼的耦合性更低。
使用時需要引入依賴庫:
implementation 'org.greenrobot:eventbus:3.1.1'
網上封裝的例子有很多,此處使用註解的方式,先定義一個運行時的註解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindEventBus {
}
在基類中添加使用的方法,並通過判斷是否添加了註解,來確定是否調用註冊的方法:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 若使用BindEventBus註解,則綁定EventBus
if(this.getClass().isAnnotationPresent(BindEventBus.class)){
EventBusUtils.register(this); //必需要先註冊
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 若使用BindEventBus註解,則解綁定EventBus
if(this.getClass().isAnnotationPresent(BindEventBus.class)){
EventBusUtils.unregister(this);//必須要解除註冊,防止內存泄漏
}
}
對Event進行封裝,Eventbus傳遞數據需要一個實體類對象,通過傳遞該對象來傳遞數據。如果不封裝,那麼每次傳遞數據都要重新創建一個實體類,來承載數據,這裏固定封裝好一個可以別處複用的,通過code來區分數據發送的主體,並可用於判斷何處應該獲取到相應的數據並處理。
public class Event<T> {
private int code;
private T data;
public Event(int code, T data) {
this.code = code;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
發送消息的封裝類,此處封裝爲了更加方便統一的調用:
public class EventBusUtils {
/**
* 綁定 接受者
* @param subscriber
*/
public static void register(Object subscriber) {
EventBus.getDefault().register(subscriber);
}
/**
* 解綁定
* @param subscriber
*/
public static void unregister(Object subscriber){
EventBus.getDefault().unregister(subscriber);
}
/**
* 發送消息(事件)
* @param event
*/
public static void sendEvent(Event event){
EventBus.getDefault().post(event);
}
/**
* 發送 粘性 事件
*
* 粘性事件,在註冊之前便把事件發生出去,等到註冊之後便會收到最近發送的粘性事件(必須匹配)
* 注意:只會接收到最近發送的一次粘性事件,之前的會接受不到。
* @param event
*/
public static void sendStickyEvent(Event event){
EventBus.getDefault().postSticky(event);
}
}
//使用時需要用EventBusUtils來發送你要傳遞的數據,此處只用調用方法發送即可(ABC爲承載數據的實體類)。如下:
Event<ABC> event=new Event<>(0,new ABC());
EventBusUtils.sendEvent(event);
接收時,在接收處的類上加上前面定義的註解,然後寫個接收方法,方法名可以隨意。但是一定要在方法名上加上一個註解。具體如下:
@BindEventBus
public class ABCActivity extends BaseActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//方法名可以隨意,但是一定要加上@Subscribe註解,並指定線程
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(Event<ABC> event){
// do something
}
}
至此,封裝及使用完成。Enjoy it!
感謝:
https://blog.csdn.net/jiashuai94/article/details/79725755
https://www.jianshu.com/p/bf5c431872bf