当前位置: 首页 > news >正文

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;
    }
}
View Code

单例封装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;
    }
}
View Code

注册和取消注册订阅事件

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);
    }
View Code

事件订阅者处理事件

和EventBus一样用@Subscribe来订阅事件,在MainActivity中添加如下代码。

@Subscribe
public void setContent(BusData data) {
      tv_message.setText(data.getMessage());
}
View Code

同样的用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();
            }
        });
    }
}
View Code

这样我们运行程序点击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);
    }
}
View Code

在MainActivity跳转到SecondActivity时,MainActivity会马上收到事件。

github源码下载

相关文章:

  • 反思总结然后整装待发
  • 当SetTimeout遇到了字符串
  • ABP文档 - EntityFramework 集成
  • [Java基础] Java中List.remove报错UnsupportedOperationException
  • 查看linux服务器的系统信息
  • sql事务、视图和索引
  • 谈谈springmvc的ResponseBodyAdvice
  • C语言之从内存角度理解不同类型的变量
  • Android 利用线程运行栈StackTraceElement设计Android日志模块
  • .Net中ListT 泛型转成DataTable、DataSet
  • linux线程的实现【转】
  • JAVA设计模式
  • 你知道市面上机器人都用哪些操作系统吗【转】
  • ArcGIS安装错误1402
  • 前端的学习
  • 「译」Node.js Streams 基础
  • bootstrap创建登录注册页面
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES6系统学习----从Apollo Client看解构赋值
  • Java|序列化异常StreamCorruptedException的解决方法
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • node学习系列之简单文件上传
  • Python连接Oracle
  • session共享问题解决方案
  • Web标准制定过程
  • 从零开始的无人驾驶 1
  • 经典排序算法及其 Java 实现
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (solr系列:一)使用tomcat部署solr服务
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (离散数学)逻辑连接词
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)iOS字体
  • (转载)深入super,看Python如何解决钻石继承难题
  • ***详解账号泄露:全球约1亿用户已泄露
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .py文件应该怎样打开?
  • ;号自动换行
  • @Resource和@Autowired的区别
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ 转载 ] SharePoint 资料
  • [AIGC] Java 和 Kotlin 的区别
  • [AIGC] 使用Curl进行网络请求的常见用法