SimpleNews 项目的重构之旅(3) -EventBus 接入

96
無名小子的杂货铺
2017.06.02 13:06* 字数 669

通过需求使用 EventBus

之前就接触过 EventBus ,只是没有在项目中使用过,练习地址 WPEventBusDemo ,今天在项目中接入 EventBus 。

最开始的目的是为了做一个完全退出机制,看了网上很多用自己记录 Activity 栈来实现,感觉这种方式太重,因为 Android本身是有这种栈的机制的,我们自己来控制可能会出现各种问题,也查阅了一下使用 EventBus 来实现这个效果。

通过 EventBus 能很简单的能实现完全退出 Activity 效果得益于 EventBus 整个框架的易用性,我们都知道观察者模式也都用过,EventBus 就是基于观察者模式,针对 Android 的发布/订阅的事件总线。

可以代替 Handler,BroadCast等在一些情况下的使用,如果没有这个机制,实现起来可能得通过接口回调,广播接收等方式来实现,特别麻烦,而且扩展性不高,也不够统一。

通过这张图可以看到,订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。

EventBus-引自 Github 官方

详细的使用可以查看官方文档 EventBus
或者查看练习地址 WPEventBusDemo,其中也通过自定义来学习和加深 EventBus 印象

举例

一个 Activity 中的 两个 Fragment 之间做数据通讯,最原始的方式可能是,两个 Fragment 通过 Avtivity 作为中间着进行沟通,但是如果使用 EventBus 就特别简单了,两个 Fragment 想得到什么样类型的响应,就去订阅什么类型的事件,例如:接口加载到数据通过 EventBus 发布一个事件就可以了。

总是能够节省很多代码,也可以解耦代码

退出 App 所有 Activity

所有的 Activity 都需要继承 BaseActivity,在最外层 Activity 退出的时候,发布一个退出事件即可。

public class BaseActivity extends AppCompatActivity {
    private static final String TAG = "BaseActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(AppExitEvent event) {
        Log.i(TAG,"onMessageEvent:" + event);
        finish();
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() != KeyEvent.ACTION_UP) {
            return super.dispatchKeyEvent(event);
        }
        return super.dispatchKeyEvent(event);
    }

}

基本用法

EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().post(object);//发布事件
EventBus.getDefault().unregister(this);//取消订阅

SimpleNews 项目的重构之旅其他文章

SimpleNews 项目的重构之旅(1) -项目架构定位 & Gradle 全局配置
SimpleNews 项目的重构之旅(2) - 整理项目 .gitignore 文件
SimpleNews 项目的重构之旅(3) -EventBus 接入
SimpleNews 项目的重构之旅(4) -Gradle for Android 基础知识汇总
SimpleNews 项目的重构之旅(5) - Android Gradle 打包&混淆应用
SimpleNews 项目的重构之旅(6) - 命名规范 & Android Toolbar
SimpleNews 项目的重构之旅(7) - 改头换面&深度清理

SimpleNews 项目
Web note ad 1