Android开源框架之EventBus

2023-10-31

EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。其实只要是一个Java类,都能使用EventBus来完成通信。简单地说:就是可以将某个页面想要传递的信息(例如在目标页面的textview中显示“hello world!”)简便且高效率地传递给目标页面。

在这里插入图片描述
代码实现:

EventBusActivity

package com.atguigu.android.eventbus;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.atguigu.android.R;
import com.atguigu.android.eventbus.event.MessageEvent;
import com.atguigu.android.eventbus.event.StickyEvent;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

// eventbus
public class EventBusActivity extends Activity {
    private TextView tv_title;
    private Button bt_eventbus_send;
    private Button bt_eventbus_sticky;
    private TextView tv_eventbus_result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus);
        
        initView();
        initData();
        initListener();
    }

    private void initListener() {
        // 跳转到发送页面
        bt_eventbus_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(EventBusActivity.this, EventBusSendActivity.class);
                startActivity(intent);
            }
        });

        // 发送粘性事件到发送页面
        bt_eventbus_sticky.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 2 发送粘性事件
                EventBus.getDefault().postSticky(new StickyEvent("我是粘性事件"));
                // 跳转到发送数据页面
                Intent intent = new Intent(EventBusActivity.this, EventBusSendActivity.class);
                startActivity(intent);
            }
        });
    }

    private void initData() {
        tv_title.setText("EventBus");
        // 1注册广播
        EventBus.getDefault().register(EventBusActivity.this);
    }

    private void initView() {
        tv_title = (TextView)findViewById(R.id.tv_title);

        bt_eventbus_send = (Button)findViewById(R.id.bt_eventbus_send);
        bt_eventbus_sticky = (Button)findViewById(R.id.bt_eventbus_sticky);
        tv_eventbus_result = (TextView)findViewById(R.id.tv_eventbus_result);
    }

    // 5接收消息
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void MesssageEventBus(MessageEvent event){

        // 显示接收的消息
        tv_eventbus_result.setText(event.name);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 2 解注册
        EventBus.getDefault().unregister(EventBusActivity.this);
    }
}

EventBusSendActivity

package com.atguigu.android.eventbus;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.atguigu.android.R;
import com.atguigu.android.eventbus.event.MessageEvent;
import com.atguigu.android.eventbus.event.StickyEvent;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

// eventbus的发送数据页面
public class EventBusSendActivity extends Activity {
    private TextView tv_title;
    private Button bt_eventbus_send_main;
    private Button bt_eventbus_send_sticky;
    private TextView tv_eventbus_send_result;

    boolean isFirstFlag = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus_send);

        initView();
        initData();
        initListener();
    }

    private void initListener() {
        // 主线程发送数据按钮点击事件处理
        bt_eventbus_send_main.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 4 发送消息
                EventBus.getDefault().post(new MessageEvent("主线程发送过来的数据"));
                //post方法发送给的是在这之前已经register的的所有activity,若晚于post方法regsiter的activity则不会接收到数据
                // 结束当前页面
                finish();
            }
        });

        // 接收粘性事件数据按钮的点击事件处理
        bt_eventbus_send_sticky.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(isFirstFlag) {
                    isFirstFlag = false;
                    // 4 注册
                    EventBus.getDefault().register(EventBusSendActivity.this);//粘性事件就是在注册之前已经post了,但是依然可以获取到该事件。
                }
            }
        });
    }

    // 3 接收粘性事件
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void StickyEventBus(StickyEvent event){
        // 显示接收的数据
        tv_eventbus_send_result.setText(event.msg);
    }

    private void initData() {
        tv_title.setText("EventBus发送数据页面");
    }

    private void initView() {
        tv_title = (TextView)findViewById(R.id.tv_title);
        bt_eventbus_send_main = (Button)findViewById(R.id.bt_eventbus_send_main);
        bt_eventbus_send_sticky = (Button)findViewById(R.id.bt_eventbus_send_sticky);
        tv_eventbus_send_result = (TextView)findViewById(R.id.tv_eventbus_send_result);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 5 解注册
        EventBus.getDefault().removeAllStickyEvents();
        EventBus.getDefault().unregister(EventBusSendActivity.this);
    }
}

MessageEvent

package com.atguigu.android.eventbus.event;

// 3 创建发送消息类
public class MessageEvent {
    public String name;
    public MessageEvent(String name) {
        this.name = name;
    }
}

StickyEvent

package com.atguigu.android.eventbus.event;

// 1创建一个粘性事件类
public class StickyEvent {
    public String msg;
    public StickyEvent(String msg) {
        this.msg = msg;
    }
}

总结:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android开源框架之EventBus 的相关文章

随机推荐

  • 判断二叉树是否为完全二叉树

    判断二叉树是否为完全二叉树 提示 本节仍然是重点说二叉树的DP递归套路 非常重要而且容易理解 二叉树的动态规划树形DP递归套路系列文章有这些 可以帮助你快速掌握树形DP的题目解题思想 就一个套路 1 判断二叉树是否为平衡二叉树 树形DP 树
  • Golang math基本数学函数

    三角函数 正弦函数 反正弦函数 双曲正弦 反双曲正弦 func Sin x float64 float64 func Asin x float64 float64 func Sinh x float64 float64 func Asinh
  • JAVA中MD5加密解密(MD5工具类)

    ASCII American Standard Code for Information Interchange 美国信息交换标准代码 http ascii 911cha com 工具类如下 import org apache common
  • 一天高中的女同桌突然问我是不是程序员,满脸黑人问号?

    背景 昨天一个我高中的女同桌突然发微信问我 你是不是程序猿 我有问题求助 先是激动后是茫然再是冷静 毕业多年不见联系 突然发个信息求助 感觉大脑有点反应不过来 再说我一个搞Python的 这点要求大家懂的 人生苦短 我用Python 为了大
  • Matlab实现神经网络RBF和PNN算法(附上完整源码)

    神经网络是一种模拟人类大脑的计算模型 能够通过学习和适应来解决各种问题 其中RBF和PNN是常用的神经网络算法 本文将介绍如何使用Matlab实现这两种算法 一 RBF算法 RBF Radial Basis Function 算法是一种基于
  • 考研数二第十一讲 罗尔中值和拉格朗日定理与柯西中值定理

    对柯西中值定理 拉格朗日中值定理的理解及应用 关于罗尔中值定理一定要理解含义 学会分析罗尔中值定理的充分条件 构造对应符合条件的函数 这样就可以利用罗尔中值定理求得函数在定义区域里可得至少一点x 使得f x 0 拉格朗日定义和柯西中值都是可
  • 保存网页图片的八种方法

    为了增加互动性和美观 现在的网页中都有许多精美的图片 这些都是网页制作者精心制作出来的 如果你想拿来为自己所用就必须把它们保存下来 另外 在一些电子书中也有精美的图片 为了防止有人复制 作者禁用了鼠标右键无法直接下载 针对以上情况 我们可以
  • Python 操作 Word

    上次给大家介绍了 Python 如何操作 Excel 是不是感觉还挺有趣的 今天为大家再介绍下 用 Python 如何操作 Word 这个可能跟数据处理关系不大 用的也不多 不过可以先了解下都能实现什么功能 以备不时之需 安装 python
  • QTimer的一点点误区

    对于Qt的信号槽 正常情况都能够发射和接收 但是对于QTimer 它有一个需要注意的地方就是 在子线程中 就是那个run函数里面 它是运行在子线程中的 创建QTimer 发现不起作用 这是因为QTimer是基于 事件循环的 qtimer又是
  • 【Unity编程】Unity动画系统(一)

    Unity动画系统 Unity动画系统 也称为 Mecanim 提供了以下功能 简单的工作流程 设置动画的所有元素 包括对象 角色和属性 支持导入外部创建的动画片段和使用内置动画编辑器制作的动画片段 人型动画重新定位 动画角色的运动控制可以
  • C++11如何结束线程

    如何结束线程 无需join detach已经启动了线程 include
  • 需求用例分析之四:业务规则

    作者 张克强 作者微博 张克强 敏捷307 在雅各布森用例分析方法和科伯恩用例分析方法中用例本身其实都没有 业务规则 的属性 但是业界使用中常常会给用例加上这个属性 这是为什么呢 为什么两位大师没有加上 是大师们疏忽了 而为什么不少人加上了
  • [附源码]java毕业设计短视频文案创作平台系统

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • 野蛮扩张结束,研发效能提升这场“仗”如何布局?

    引言 从第一块石头被打磨成石器 到青铜铸造术被发明 从蒸汽机的改良与广泛应用 到交流电和发电机的问世 纵观人类发展史 人类文明的发展始终依托于生产力与生产效率的不断提升 身处软件 吞噬 世界的数字化时代 信息技术成为企业生产力提升的核心要素
  • 3模型大小_如何在keyshot拆分模型结构,给单独的部件赋材质

    在使用keyshot的过程中 必然会遇到模型文件是整体在一起 没有拆分开 或者 模型有瑕疵 结构分布不合理的情况 本文将以手机壳为例 演示在keyshot里面 怎么拆开结构 达到给细分结构赋不同材质的目的 如图模型的结构 需要将结构1 2
  • IDEA连接hadoop hdfs

    一 下载插件 进入一下界面 搜索 big data tools 重启IDEA 二 本地配置 首先保证浏览器可以访问到 按照下述步骤创建一个HDFS连接 点击Test Connection出现报错 点击哪个报错的链接 https cwiki
  • split按两种符号分割字符串

    有字符串String string 李磊 20 张扬 19 胡杨 26 String string1 string substring 1 string length 1 去掉两端引号 String str string split 根据分
  • Ubuntu下JDK安装图解

    转载 https www linuxidc com Linux 2016 05 131348 htm 联网情况下这个命令搞定 sudo apt get install openjdk 7 jdk 软件环境 虚拟机 VMware Workst
  • 面对海量数据用Excel无从下手?试试Jupyter吧

    全文共 4715字 预计学习时长 10分钟 最近 一篇很有见地的文章 Jupyter即新型Excel Jupyter is the new Excel 备受瞩目 很多专业人士在应对大量数据分析任务时首选Excel 但文章作者Semi Koe
  • Android开源框架之EventBus

    EventBus是一个Android端优化的publish subscribe消息总线 简化了应用程序内各组件间 组件与后台线程间的通信 比如请求网络 等网络返回时通过Handler或Broadcast通知UI 两个Fragment之间需要