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.youkuaiyun.com/jiashuai94/article/details/79725755
https://www.jianshu.com/p/bf5c431872bf

### 使用MVP架构模式进行代码封装的最佳实践 #### 封装基类提升代码可读性和维护性 通过对MVP模式中`Presenter`, `View`以及`Model`组件的合理抽象和封装,能够显著提高项目的可维护性和扩展性。具体来说,在创建应用时可以通过定义一组公共接口或者基类来减少重复代码并保持一致性[^1]。 对于`Presenter`而言,通常会将其持有`ViewModel`层实例的部分作为通用逻辑抽取到一个基础类当中。这涉及到利用Java中的泛型机制,并采用弱引用(`WeakReference`)的方式获取`View`层对象;而在解除关联(`detachView`)操作里,则需确保及时清理这些引用以防内存泄漏的发生——即设置`view=null`[^2]。 #### 解耦合与通信总线的选择 为了进一步增强系统的灵活性,可以在`Presenter`同`Model`间引入诸如EventBus3、RxBus或是LiveDataBus这样的消息传递工具充当两者间的桥梁。借助这类库的帮助不仅有助于分离关注点,同时也简化了跨层之间的交互流程。 #### 生命周期管理的重要性 考虑到移动应用程序特有的活动周期特性(如Android平台上的Activity/Fragment),应当特别注意使自定义组件遵循相应的生命周期规则。这意味着要适当地在适当的时间点调用相应的方法完成资源初始化或释放工作,从而保障程序运行期间不会因为不当的操作而导致异常情况发生[^3]。 ```java public abstract class BasePresenter<V> { private WeakReference<V> mViewRef; public void attachView(V view){ this.mViewRef = new WeakReference<>(view); } protected V getView(){ return mViewRef.get(); } public boolean isViewAttached() { return mViewRef != null && mViewRef.get() != null; } public void detachView(){ if (this.mViewRef!=null){ this.mViewRef.clear(); this.mViewRef = null; } } } ``` 上述代码展示了如何构建一个简单的`BasePresenter`类,该类负责管理和维持对视图层的弱引用关系,同时提供了基本的功能支持以便子类继承使用。 #### 实现契约类以促进协作开发 所谓“契约”,是指事先约定好的一组API规范或者是协议文档,其目的在于指导开发者按照既定的标准编写各自的模块。在一个典型的MVP项目里,“契约”的概念往往体现为一系列接口声明,它们明确了各个角色应具备哪些行为能力及其输入输出参数形式等细节信息。这样做有利于团队成员之间更好地理解彼此的工作范围边界所在,进而加快整个产品的迭代速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值