文档章节

Android事件总线框架Otto

恰同学少年
 恰同学少年
发布于 2016/02/14 22:17
字数 610
阅读 238
收藏 13

1、下载EventBus的类库

源码:https://github.com/square/otto

2、基本使用

@Subscribe

订阅事件,也就是事件的处理者,它有且仅有一个参数YourEvent,每一个Subscribe对应处理一个YourEvent。Event用于连接(匹配)post和订阅。@Subscribe使用举例:

@Subscribe
public void reveiverMethod(YourEvent event){
   //...TODO 
}

@Produce

产生事件,改方法在对象被register后即被调用(–使用情况比较特殊的),该方法必须有一个非空的返回值,参数必须为空。 bus.post(new YourEvent(…))

发送一个事件,等待@Subcribe处理

public class MainActivity extends Activity {
 
    TextView tvShow;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BusManager.getInstance().register(this);
        System.out.println(debug:onCreate);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_1).setOnClickListener(new OnClickListener() {
 
            @Override
            public void onClick(View arg0) {
                BusManager.getInstance().post(new MyEvent(将我点击的内容,发送出去));
            }
        });
        tvShow = (TextView) findViewById(R.id.tv_show);
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        BusManager.getInstance().unregister(this);
    }
 
    @Subscribe
    public void receiveEventByParam(MyEvent event) {
        System.out.println(debug: + event.getContent());
        if (tvShow != null) {
            tvShow.setText(event.getContent());
        }
    }
 
    @Produce
    public MyEvent sendEvent() {
        return new MyEvent(这是我产生的事件(@Produce));
    }
}

BusManager 是一个单例

public class BusManager {
    private static Bus bus = null;
    private BusManager() {
    }
    public static synchronized Bus getInstance() {
        if (bus == null) {
            bus = new Bus();
        }
        return bus;
    }
}

MyEvent 自己定义的事件类

public class MyEvent {
    private String content;
 
    public String getContent() {
        return content;
    }
 
    public void setContent(String content) {
        this.content = content;
    }
 
    public MyEvent(){
 
    }
 
    public MyEvent(String content) {
        super();
        this.content = content;
    }
 
}

运行结果

05-20 20:41:59.923: I/System.out(30320): debug:这是我产生的事件(@Produce)
05-20 20:41:59.923: I/System.out(30320): debug:onCreate
05-20 20:42:11.553: I/System.out(30320): debug:将我点击的内容,发送出去

每次调用registe()方法是,会立即调用@Produce方法,将return的事件发送出去,由参数为MyEvent的@Subscribe方法接收并处理。bus.post()也是如此。


原理

主要是Bus.java里面的代码:

关键的方法有:

public void register(Object object)

该方法的作用是查找object里面所有带有Produce和Subscribe注解的方法,并保存在Map中,并且会立即执行Produce注解的方法。

public void post(Object event)

发送事件event,根据之前注册过的object里面的方法,查找参数为event的Subscribe方法,并invoke该方法。这样就达到了post之后,调用对应Subscribe方法的目的。

public void unregister(Object object)

注销object,删除掉map中保存的object的方法,释放object,防止内存泄露。


© 著作权归作者所有

恰同学少年
粉丝 15
博文 70
码字总数 23613
作品 0
深圳
高级程序员
私信 提问
Android EventBus二三事

废话很多的前言 EventBus,也即事件总线。在[wiki][event_monitor]上有关于Event Monitor的一个说法: Event monitoring makes use of a logical bus to transport event occurrences from so......

苦辛味
2014/09/21
0
0
Otto事件总线 -- 控件之间通讯框架使用 --模式解析

前言:Otto事件总线 -- 控件之间通讯框架 对于之前的情况activity之间或者fragment之间等跳转传值一般都是用bundle、intent等,从activityA --- activityB用startActivity,用startActivityFo...

CMusketeer
2018/08/16
0
0
15 个 Android 通用流行框架大全

1. 缓存 DiskLruCache Java实现基于LRU的磁盘缓存 2.图片加载 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库 Picasso 一个强大的图片下载与缓存的库 Fresco 一个用于管...

oschina
2016/05/29
83.1K
32
【Android翻译】组件通信模式

目标:避免紧耦合 本文对原文进行了精简 原文链接:Communication patterns for application components 紧耦合 组件之间相互持有引用,以及直接调用方法.在下面的代码中,MenuFragment持有Magaz...

xesam
2015/04/23
0
0
基于 Guava 的事件总线--Otto

Otto 是基于 Guava 的,增强的事件总线,强调 Android 支持。 Otto 是把应用分离成不同部分,但是仍然可以很好的进行通讯。Otto 是从 Guava forked 而来,但是添加了许多独特的功能,而且精炼...

李三石
2014/07/11
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
45分钟前
6
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
5
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
4
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
10
0
高德API入门教程

项目需求 1、实现打开地图就能定位到中心显示标注点 2、点击标注显示保利可爱岛的详细信息 3、实现导航功能 <!doctype html><html><head> <meta charset="utf-8"> <meta http-......

我叫小糖主
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部