Android —— 事件總線EventBus封裝及使用

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

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