当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. 联合体union的详解

    1.概述 联合体union的定义方式与结构体一样,但是二者有根本区别. 在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和.而在“联合”中,各成员共享一段内存空间,一个联合变量的长度 ...

  2. WebSocket协议详解

    转自 http://www.cnblogs.com/lizhenghn/p/5155933.html 1. websocket 是什么 websocket 是html5提出的一个协议规范,参考rfc6 ...

  3. VIM 使用心得

    序 到百度外卖任职以后,发现在我们部门无论 mac 还是 windows,程序员们清一色地都在使用 VIM 来编辑代码,期间穿插着各种插件.快捷键.眼花缭乱的命令.我在大学时只会极少的 VIM 命令, ...

  4. SIFT特征原理简析(HELU版)

    SIFT(Scale-Invariant Feature Transform)是一种具有尺度不变性和光照不变性的特征描述子,也同时是一套特征提取的理论,首次由D. G. Lowe于2004年以< ...

  5. 20144303石宇森《网络对抗》MSF基础应用

    20144303石宇森<网络对抗>MSF基础应用 实验后回答问题 一.解释什么是exploit,payload,encode: 我认为exploit就是一个简单的攻击指令,就是对配置所有设 ...

  6. 分布式系统一致性协议--Paxos算法

    Paxos: Paxos算法背景介绍: Paxos算法是分布式技术大师Lamport提出的,主要目的是通过这个算法,让参与分布式处理的每个参与者逐步达成一致意见.用好理解的方式来说,就是在一个选举过程 ...

  7. Wireshark分析RabbitMQ

    消费者Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  8. 51nod 1051 最大子矩阵和

    没想到居然可以O(n3)暴力过 就是大概之前的  最大连续子序列和 加成2维度了  枚举起始列 和 终止列 然后计算从1到n行最大的子矩阵的和 注意n 和 m 的输入顺序!! #include< ...

  9. BZOJ3298: [USACO 2011Open]cow checkers 威佐夫博弈

    Description 一天,Besssie准备和FJ挑战奶牛跳棋游戏.这个游戏上在一个M*N的棋盘上, 这个棋盘上在(x,y)(0<=x棋盘的左下角是(0,0)坐标,棋盘的右上角是坐标(M-1 ...

  10. WebApi——json返回多了 k_BackingField

    产生原因: model类添加了    [System.Serializable] 解决方案: xxxxx.WebApi\App_Start\WebApiConfig.cs的Register函数中添加如 ...