Android xBus

简洁的 EventBus 实现
授权协议 Apache
开发语言 Java
所属分类 手机/移动开发、 手机开发包
软件类型 开源软件
地区 不详
投 递 者 盖成弘
操作系统 Android
开源组织
适用人群 未知
 软件概览

xBus 是基于发布订阅(Pub/Sub)模式的一个事件消息库,使用通用的 register(target), unregister(target), post(event) 消息通信接口,能有效的减少甚至消除Android应用中异步任务逻辑和界面更新之间的耦合,实现模块化,提高开发效率。

使用指南

Gradle 集成

    compile 'com.mcxiaoke.xbus��1.0.+'

接收事件

public class SimpleActivity extends Activity {
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 注册
        Bus.getDefault().register(this);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消注册
        Bus.getDefault().unregister(this);
    }
    @BusReceiver
    public void onStringEvent(String event) {
        // handle your event
        // 这里处理事件
    }
    @BusReceiver
    public void onSomeEvent(SomeEventClass event) {
        // SomeEventClass表示任意的自定义类
        // handle your event
        // 这里处理事件
    }
    @BusReceiver
    public void onObjectEvent(Object event) {
        // 不建议使用Object,会收到所有类型的事件
        // handle your event
        // 这里处理事件
    }
}

发送事件

然后在需要的地方调用 post(event) 发送事件通知,如 Service 或某个线程里,可以在任何地方发送事件:

// 比如在IntentService里
public class SimpleService extends IntentService {
    public SimpleService() {
        super("SimpleService");
    }
    @Override
    protected void onHandleIntent(final Intent intent) {
       // 这里是举例,可以在任何地方发送事件
        Bus.getDefault().post("String Event");
        Bus.getDefault().post(new SomeEventClass());
        Bus.getDefault().post(new Object());
    }
}

高级用法

任何地方注册

你还可以选择在 onStart() 里注册,在 onStop() 里取消注册。你完全可以在任何地方注册和取消注册,没有任何限制。但是建议你在生命周期事件方法里注册和取消注册,如 Activity/Fragment/ServiceonCreate/onDestroy 方法里, register()unregister() 建议配对使用,避免内存泄露。

 @Override
    protected void onStart() {
        super.onStart();
        // you can also register here
        Bus.getDefault().register(this);
    }
    @Override
    protected void onStop() {
        super.onStop();
        // you can also unregister here
        Bus.getDefault().unregister(this);
    }

自定义 Bus

你也可以不使用默认的 Bus.getDefault(),改用自己创建的 Bus 对象:

public class MainApp extends Application {
    private Bus mBus = new Bus();
    @Override
    public void onCreate() {
        super.onCreate();
    }
    public Bus getBus() {
        return mBus;
    }
}

Debug

默认不输出任何LOG信息,可以这样启用调试模式:

public Bus setDebug(final boolean debug)

MethodFinder

默认使用注解(@BusReceiver)识别事件接收器方法,可以这样修改 :

public Bus setMethodFinder(final MethodFinder finder)

默认使用的是 AnnotationMethodFinder,只有使用了 @BusReceiver 的方法才可以接受事件。

可选使用 NamedMethodFinderNamedMethodFinder 使用方法名识别,默认方法名是 onEvent ,你可以指定其它的方法名。

使用 NamedMethodFinder 会比使用 AnnotationMethodFinder 效率高一点,因为它忽略注解,直接使用方法名字符串匹配。一般使用,两者差别不大。

你还可以实现 MethodFinder 接口,自定义其它的事件接收器方法匹配模式:

interface MethodFinder {

    Set<MethodInfo> find(final Bus bus, final Class<?> targetClass);
}

StrictMode

宽泛匹配模式

默认情况下, Bus 使用宽泛的事件类型匹配模式,事件参数会匹配它的父类和接口,如果你调用 post(String),那么这几个方法都会收到举例:

// 如果你调用这个方法,发送一个StringBuilder类型的事件
Bus.getDefault().post(new StringBuilder("Event"));
// 这几个方法会收到事件
public void onEvent1(StringBuilder event) // 匹配,类型相符
public void onEvent2(Object event) // 匹配,StringBuilder是Object的子类
public void onEvent3(CharSequence event) // 匹配,StringBuilder是CharSequence的实现类
public void onEvent4(Serializable event) // 匹配,StringBuilder实现了Serializable接口
// 这几个方法不会收到事件
public void onEvent5(Exception event) 不匹配,Exception与String完全无关
public void onEvent6(String event) // 不匹配,StringBuilder不能转换成String类型

对于 post(event)onEvent(EventType) ,匹配规则是:如果  event.getClass()  可以强制转换成 EventType,那么匹配成功,能收到事件。

严格匹配模式

可以使用下面的方法更改默认行为,使用严格的事件类型匹配模式:

public Bus setStrictMode(final boolean strictMode)

启用严格匹配模式后,发送和接受方法的参数类型必须严格匹配才能收到事件,举例:

// setStrictMode(true) 启用严格模式后:
Bus.getDefault().post(new StringBuilder("Event"));
// 只有 onEvent1 能收到事件
public void onEvent1(StringBuilder event)
public void onEvent2(Object event)public void onEvent3(CharSequence event) 
public void onEvent4(Serializable event)
public void onEvent5(Exception event)
public void onEvent6(String event)

对于 post(event)onEvent(EventType) ,严格模式的匹配规则是当且仅当 event.getClass().equals(EventType) 时才能收到事件。

说明:启用严格模式效率会稍微高一点,因为不会递归查找 event 的父类和实现的接口,但是由于 Bus 内部使用了缓存,对于同一个事件类型,并不会重复查找,所以实际使用几乎没有差别。

StickyEvent

可以使用下面的方法发送 Sticky 事件,这种事件会保留在内存中,当下一个注册者注册时,会立即收到上一次发送的该类型事件,每种类型的事件只会保留一个, Sticky 事件使用严格匹配模式。

public <E> void postSticky(E event)

一般不需要使用 Sticky 事件,但在某些场景下可以用到,比如一个网络状态监听服务,会不断的发送网络状态信息,接受者一旦注册就可以立即收到一个事件,可以知道当前的网络状态。

@BusEvent

还有一个注解 @BusEvent 可用于标注某个类是事件类,这个像 @Override 注解一样,纯标注用,没有其它用途,没有运行时消耗。

实现教程

  • Android 流行框架查速表 缓存框架 DiskLruCache   Java实现基于LRU的磁盘缓存 ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。 图片加载 Android Universal Image Loader  应该是使用最多的图片缓存,支持主流图片缓存的绝大多数特性 特性: 多线程图片加载(同步或

 相关资料
  • 我们在“线性回归的简洁实现”一节中已经了解了使用Gluon实现模型的便利。下面,让我们再次使用Gluon来实现一个softmax回归模型。首先导入所需的包或模块。 %matplotlib inline import d2lzh as d2l from mxnet import gluon, init from mxnet.gluon import loss as gloss, nn 获取和读

  • 在Gluon中,我们可以很方便地使用数据并行进行多GPU计算。例如,我们并不需要自己实现“多GPU计算”一节里介绍的多GPU之间同步数据的辅助函数。 首先导入本节实验所需的包或模块。运行本节中的程序需要至少2块GPU。 import d2lzh as d2l import mxnet as mx from mxnet import autograd, gluon, init, nd from

  • 随着深度学习框架的发展,开发深度学习应用变得越来越便利。实践中,我们通常可以用比上一节更简洁的代码来实现同样的模型。在本节中,我们将介绍如何使用MXNet提供的Gluon接口更方便地实现线性回归的训练。 生成数据集 我们生成与上一节中相同的数据集。其中features是训练数据特征,labels是标签。 from mxnet import autograd, nd num_inputs =

  • 下面我们使用Gluon来实现上一节中的多层感知机。首先导入所需的包或模块。 import d2lzh as d2l from mxnet import gluon, init from mxnet.gluon import loss as gloss, nn 定义模型 和softmax回归唯一的不同在于,我们多加了一个全连接层作为隐藏层。它的隐藏单元个数为256,并使用ReLU函数作为激活函数

  • 本文向大家介绍Android实现简洁的APP登录界面,包括了Android实现简洁的APP登录界面的使用技巧和注意事项,需要的朋友参考一下 今天需求要做一个所有app都有的登录界面,正好巩固一下我们之前学的基础布局知识。 先来看下效果图 1.布局的xml文件 2.java部分代码 简单的登录,用户名密码验证。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本节将使用Gluon来更简洁地实现基于循环神经网络的语言模型。首先,我们读取周杰伦专辑歌词数据集。 import d2lzh as d2l import math from mxnet import autograd, gluon, init, nd from mxnet.gluon import loss as gloss, nn, rnn import time (corpus_

  • 本文向大家介绍jQuery实现简洁的轮播图效果实例,包括了jQuery实现简洁的轮播图效果实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery实现简洁的轮播图效果。分享给大家供大家参考,具体如下: HTML: css: js: 调用JQ: 效果图: 更多关于jQuery相关内容感兴趣的读者可查看本站专题:《jQuery切换特效与技巧总结》、《jQuery扩展技巧总结》、《jQu

  • 本文向大家介绍jQuery实现简洁的导航菜单效果,包括了jQuery实现简洁的导航菜单效果的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript实现的伸展收缩型菜单代码。分享给大家供大家参考。具体如下: 运行效果截图如下: 鼠标悬浮时菜单项向上移动成蓝底白字,点击之后底部会有蓝条表示当前选中项。 页面代码,菜单的每一项都是一个 div ,其中包括一个 ul 用来放置显示文字等