当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,那么我们通常采用的就是Android中的解耦组件EventBus。EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

EventBus文档:http://greenrobot.org/eventbus/documentation

EventBus源码: https://github.com/greenrobot/EventBus.git

EventBus框架中涉及四个成分

订阅者,发布者,订阅事件,事件总线 它们的关系可以用官方的图表示:

EventBus1.0

首先你要为你的app添加依赖库:

compile 'org.simple:androideventbus:1.0.5.1'

Activity中使用有三部:

1.注册(onCreate方法下)

EventBus.getDefault().register(this);

2.监听(自定义方法即可)

@Subscriber(tag = Utils.RESULTDATA)
public void resultData(String title)
{
username.setText(title);
}

3.解除注册(onDestroy方法下)

EventBus.getDefault().unregister(this);

然后就是发布事件让监听事件接受通信信息,在更新UI操作,相关代码如下:

Activity

/****
* eventbus通信
* 1.0版本
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ EditText username;
EditText password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setTitle("登录界面");
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
initView();
}
private void initView()
{
username=(EditText)findViewById(R.id.username);
password=(EditText)findViewById(R.id.password);
findViewById(R.id.login).setOnClickListener(this);
findViewById(R.id.register).setOnClickListener(this); } /***
* (String)->这里可以是任意类型--(在返回的时候对应就行)
* @param title
*/
@Subscriber(tag = Utils.RESULTDATA)
public void resultData(String title)
{
username.setText(title);
}
//退出
@Subscriber(tag=Utils.EXIT)
public void exit(boolean isFang)
{
if (isFang) {
finish();
}
}
@Override
public void onClick(View v) {
String name=username.getText().toString();
String pwd=password.getText().toString();
switch (v.getId())
{
case R.id.login:
break;
case R.id.register:
startActivity(new Intent(MainActivity.this,RegisterActivity.class));
break;
}
} /***
* 解除注册
*/
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}

通信的Activity

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener{

    EditText username;
LinearLayout linearLayout;
Button register;
Button exit;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.setTitle("注册界面");
EventBus.getDefault().register(this);
initView();
}
private void initView()
{
username=(EditText)findViewById(R.id.username);
linearLayout=(LinearLayout)findViewById(R.id.linear);
linearLayout.setVisibility(View.GONE);
register=(Button) findViewById(R.id.login);
register.setText("注册");
register.setOnClickListener(this);
exit=(Button)findViewById(R.id.register);
exit.setText("退出");
exit.setOnClickListener(this); } @Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.login://注册
String string=username.getText().toString();
if (TextUtils.isEmpty(string))
{
Toast.makeText(getApplicationContext(),"用户名不能为空",Toast.LENGTH_LONG).show();
}
else {
//发布事件
EventBus.getDefault().post(string,Utils.RESULTDATA);
finish();
}
break;
case R.id.register://退出
EventBus.getDefault().post(true,Utils.EXIT);
finish();
break;
}
}
/***
* 解除注册
*/
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}

效果如下图:(包含用户名和退出的通信)

EventBus3.0

首先你要为你的app添加依赖库:

compile 'org.greenrobot:eventbus:3.0.0'

注册和解除注册相同,监听事件有所改变

@Subscribe(threadMode = ThreadMode.MAIN)
public void onUserName(User user)
{
username.setText(user.getUsername());
}

threadMode的之有四个:

  1. NAIN UI主线程
  2. BACKGROUND 后台线程
  3. POSTING 和发布者处在同一个线程
  4. ASYNC 异步线程

也可以订阅事件的优先级,需加参数 ,如下:

   /**
* priority:事件的优先级类似广播的优先级,优先级越高优先获得消息
* 在ui线程执行
* @param user
*/
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100)
public void onUserName(User user)
{
username.setText(user.getUsername());
}

除了上面一种事件外,EventBus还有一种黏性事件,意思就是先发布事件,在注册也能监听得到,用postSticky来发布。

EventBus.getDefault().postSticky(user);
 /**
* sticky。
* 方式2
*/
@Subscribe(sticky = true)
public void onExit(User user)
{
username.setText(user.getUsername());
}

EventBus3.0效果如下图:(包含用户名的两种通信方式)

源码点击下载

Android之EventBus1.0 和EventBus3.0的使用详解的更多相关文章

  1. hadoop 0.20.2伪分布式安装详解

    adoop 0.20.2伪分布式安装详解 hadoop有三种运行模式: 伪分布式不需要安装虚拟机,在同一台机器上同时启动5个进程,模拟分布式. 完全分布式至少有3个节点,其中一个做master,运行名 ...

  2. vue2.0 中#$emit,$on的使用详解

    vue1.0中 vm.$dispatch 和 vm.$broadcast 被弃用,改用$emit,$on 1. vm.$on( event, callback ) 监听当前实例上的自定义事件.事件可以 ...

  3. Flink 从 0 到 1 学习 —— Flink 配置文件详解

    前面文章我们已经知道 Flink 是什么东西了,安装好 Flink 后,我们再来看下安装路径下的配置文件吧. 安装目录下主要有 flink-conf.yaml 配置.日志的配置文件.zk 配置.Fli ...

  4. vue-cli3.0 脚手架搭建项目的过程详解

    1.安装vue-cli 3.0 ? 1 2 3 npm install -g @vue/cli # or yarn global add @vue/cli 安装成功后查看版本:vue -V(大写的V) ...

  5. Android PopupWindow Dialog 关于 is your activity running 崩溃详解

    Android PopupWindow Dialog 关于 is your activity running 崩溃详解 [TOC] 起因 对于 PopupWindow Dialog 需要 Activi ...

  6. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  7. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  8. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...

  9. 转: Android 软件开发之如何使用Eclipse Debug调试程序详解(七)

    转自: http://www.uml.org.cn/mobiledev/201110092.asp Android 软件开发之如何使用Eclipse Debug调试程序详解(七)   发布于2011- ...

  10. Android中Intent传值与Bundle传值的区别详解

    Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面   这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...

随机推荐

  1. Google、亚马逊、微软 、阿里巴巴开源软件一览

    Google.亚马逊.微软 .阿里巴巴开源软件一览 大公司为什么要发布开源项目?一是开源能够帮助他人更快地开发软件,促进世界创新,主要是社会价值层面的考虑.二是开源能够倒逼工程师写出更好的代码.三是开 ...

  2. java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串

    java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 package com.zdz.test; im ...

  3. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  4. Google's Machine Learning Crash Course #03# Reducing Loss

    Goal of training a model is to find a set of weights and biases that have low loss, on average, acro ...

  5. 通过一个例子了解Ajax

    Ajax指的Asyncronous JavaScript and XML Ajax并不是什么新的编程语言, 它是现有一些东西的应用.从它的名称中就可以看出来 假如我们设想, 浏览器展示了一个页面,但需 ...

  6. CAN通信(STM32)

    1.CAN是控制器局域网络(Controller Area Network, CAN)的简称 (理论知识不做讲解了,太多了) 2.芯片选用:TJA1050 差分信号输入, 这里的显性电平CANH和CA ...

  7. 如何安装多个jdk

    1.首先去官网下载不同版本的jdk 下载地址:http://www.oracle.com/technetwork/java/javase/archive-139210.html 2.下载后我的安装路径 ...

  8. Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

    在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...

  9. Dell Vostro5370安装Win10/Ubuntu18LTS

    如何安装Win10/Ubuntu双系统 测试环境: DELL PRECISION 7510: CPU:Intel Core i5-6300HQ HD:256G NVME SSD 操作步骤: 无损将硬盘 ...

  10. Ansible 入门指南 - 常用模块

    介绍 module 文档: 官宣-模块分类的索引 官宣-全部模块的索引 在playbook脚本中,tasks 中的每一个 action都是对 module的一次调用.在每个 action中: 冒号前面 ...