Android事件总线(三)otto用法全解析
前言
otto 是 Square公司发布的一个发布-订阅模式框架,它基于Google Guava 项目中的event bus模块开发,针对Android平台做了优化和加强。虽然Square已经停止了对otto的更新并推荐使用RxJava和RxAndroid来替代它,但是otto的设计理念和源码仍旧值得学习,这一篇先来学习下otto的使用方法。
添加依赖库
首先配置gradle,如下所示。
compile 'com.squareup:otto:1.3.8'
定义消息类
与EventBus一样,我们接着定义消息类,它是一个bean文件,如下所示。
public class BusData {
public String message;
public BusData(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
单例封装Bus
otto的Bus类相当与EventBus中的EventBus类,它封装了otto的主要功能,但它不是个单例,每次都要用new创建出来,这样显然不是很方便,因此我们用单例模式将它封装起来,如下所示。
public class OttoBus extends Bus{
private volatile static OttoBus bus;
private OttoBus (){
}
public static OttoBus getInstance() {
if (bus == null) {
synchronized (OttoBus.class){
if(bus==null){
bus = new OttoBus();
}
}
}
return bus;
}
}
注册和取消注册订阅事件
otto同样需要注册和取消注册订阅事件,通过OttoBus得到Bus对象,调用Bus的register和unregister方法来注册和取消注册,同时我们定义一个button,点击这个button跳转到SecondActivity,SecondActivity用来发送事件。代码如下所示。
public class MainActivity extends AppCompatActivity {
private Button bt_jump;
private TextView tv_message;
private Bus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_message= (TextView) this.findViewById(R.id.tv_message);
bt_jump= (Button) this.findViewById(R.id.bt_jump);
bt_jump.setText("跳转到SecondActivity");
bt_jump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
bus=OttoBus.getInstance();
bus.register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册订阅事件
bus.unregister(this);
}
事件订阅者处理事件
和EventBus一样用@Subscribe来订阅事件,在MainActivity中添加如下代码。
@Subscribe
public void setContent(BusData data) {
tv_message.setText(data.getMessage());
}
同样的用textView来显示接收到的消息。
使用post发送事件
创建SecondActivity,并设置一个button,点击发送事件,并finish掉自身,如下所示。
public class SecondActivity extends AppCompatActivity {
private Button bt_jump;
private OttoBus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_jump= (Button) this.findViewById(R.id.bt_jump);
bt_jump.setText("发送事件");
bt_jump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OttoBus.getInstance().post(new BusData("刘望舒的博客更新了"));
finish();
}
});
}
}
这样我们运行程序点击MainActivity的”跳转到SecondActivity”按钮直接跳转到SecondActivity,再点击”发送事件”按钮,SecondActivity被finish掉回到MainActivity ,MainActivity 中的textView的文字变为了”刘望舒的博客更新了”。
使用@Produce来发布事件
Produce注解用来生产发布事件,需要注意的是它生产事件前它需要注册,并且在生产完事件后需要取消注册。如果使用这种方法则在跳转到发布者所在的类中则会立即产生事件并触发订阅者,修改SecondActivity,代码如下所示
public class SecondActivity extends AppCompatActivity {
private Button bt_jump;
private OttoBus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_jump= (Button) this.findViewById(R.id.bt_jump);
bt_jump.setText("发送事件");
bt_jump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
bus=OttoBus.getInstance();
bus.register(this);
}
@Produce
public BusData setInitialContent() {
return new BusData("刘望舒的博客更新了");
}
@Override
protected void onDestroy() {
super.onDestroy();
bus.unregister(this);
}
}
在MainActivity跳转到SecondActivity时,MainActivity会马上收到事件。
Android事件总线(三)otto用法全解析的更多相关文章
- Android事件总线分发库EventBus3.0的简单讲解与实践
Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...
- Android事件总线(一)EventBus3.0用法全解析
前言 EventBus是一款针对Android优化的发布/订阅事件总线.简化了应用程序内各组件间.组件与后台线程间的通信.优点是开销小,代码更优雅,以及将发送者和接收者解耦.如果Activity和Ac ...
- Android事件总线(四)源码解析otto
前言 上一篇文章中讲到了otto的用法,这一篇我们来讲一下otto的源码.可能有人觉得otto过时了,但是通过源码我们学习的是高手设计otto时的设计理念,这种设计理念是不过时的. otto各个类的作 ...
- 【第三篇】学习 android 事件总线androidEventbus之发布事件,子线程中接收
发送和接收消息的方式类似其他的发送和接收消息的事件总线一样,不同的点或者应该注意的地方: 1,比如在子线程构造方法里面进行实现总线的注册操作: 2,要想子线程中接收消息的功能执行,必须启动线程. 3, ...
- 【第三篇】学习 android 事件总线androidEventbus之list数据事件的传递,发送list数据事件到另外一个Activity
这个和普通的事件总线的发送接收一样. package com.example.mysimpleeventbus; import java.util.ArrayList; import java.uti ...
- 45、Android事件总线分发库的使用
事件总线分发库EventBus和Otto的简介及对比 什么是事件总线管理: a.将事件放到队列里,用于管理和分发b.保证应用的各个部分之间高效的通信及数据.事件分发c.模块间解耦 Event Bus是 ...
- 事件总线帧---Otto
我们如果这样一种业务场景.如今在做一款及时聊天应用,我们在聊天页面进行收发信息.同一时候也要实时更新前一页面的聊天记录,这时我们该怎样去实现?说说我曾经的实现策略.我使用的是广播接收器BroadCas ...
- 事件总线框架---Otto
我们假设这样一种业务场景,现在在做一款及时聊天应用,我们在聊天页面进行收发信息,同时也要实时更新前一页面的聊天记录,这时我们该如何去实现?说说我以前的实现策略,我使用的是广播接收器BroadCastR ...
- Android事件总线EventBus详解
顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码 ...
- Android事件总线还能怎么玩?
作者简介:何红辉,Android工程师,现任职于友盟. 顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件 ...
随机推荐
- 导入Excel文件
选择文件 #region //获取路径 string FilePath = ""; //选择文件 OpenFileDialog openFileDialog1 = new Open ...
- [源码]Dephi溢出demo( Shellcode for XP)
[源码]Dephi溢出demo( Shellcode for XP) unit Unit1; interface uses Windows, Messages, SysUtils, Variants, ...
- Java程序员如何运用所掌握的技术构建一个完整的业务架构
1.通用架构概述 创业之初,我们往往会为了快速迭代出产品,而选择最简单的技术架构,比如LAMP架构,SSH三层架构.这些架构可以适应初期业务的快速发展,但是,随着业务变得越来越复杂,我们会发现这些架构 ...
- 从零开始学 Web 之 ES6(一)ES5严格模式
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 音频标签化2:youtube-8m项目的训练、评估与测试
之前小程介绍了使用机器学习的办法来解决"音频标签化"的问题,并且提到了训练样本audioset跟youtube-8m的dataset,而训练模型上也提到了youtube-8m的模型 ...
- SpringMVC之json数据交互
在Spring3.1之后,如果使用<mvc:annotation-driven />,即使用注解驱动,默认情况下已经配置了MappingJackson2HttpMessageConvert ...
- delete attempted to return null from a method with a primitive return type (int)
今天被自己给蠢死了 今天在代码中遇到这个错误, 百度翻译一下:映射方法,从一org.system.mapper.child.chmorganizationexaminationmapper.delet ...
- PHP 5.3中的命名空间使用方法
PHP的命名空间(namespace)是php5.3之后才有的.这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的. 为什么php中要使用namespace? 假设如 ...
- m2eclipse(maven插件)报错解决
在eclipse中安装了m2eclipse(maven插件) 的问题结解决 在安装后,出现下列警告: The Maven Integration requires that Eclipse be ru ...
- AutoIt介绍
AutoIt的下载网址: https://www.autoitscript.com/site/autoit/downloads/ AutoIt在线文档:http://www.autoit3.cn/Do ...