原文:https://www.jianshu.com/p/f9ae5691e1bb

01 前言

当我们进行项目开发的时候,往往是需要应用程序的各组件、组件与后台线程间进行通信,比如在子线程中进行请求数据,当数据请求完毕后通过Handler或者是广播通知UI,而两个Fragment之家可以通过Listener进行通信等等。当我们的项目越来越复杂,使用Intent、Handler、Broadcast进行模块间通信、模块与后台线程进行通信时,代码量大,而且高度耦合。现在就让我们来学习一下EventBus 3.0吧。

02 什么是EventBus

EventBus Github地址
进入官网,看看人家是怎么解释的:

  • simplifies the communication between components
    decouples event senders and receivers
    performs well with Activities, Fragments, and background threads
    avoids complex and error-prone dependencies and life cycle issues
  • makes your code simpler
  • is fast
  • is tiny (~50k jar)
  • is proven in practice by apps with 100,000,000+ installs
  • has advanced features like delivery threads, subscriber priorities, etc.

大概的意思就是:EventBus能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分离事件发送方和接收方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命周期问题。

03 关于EventBus的概述

三要素

  • Event 事件。它可以是任意类型。
  • Subscriber 事件订阅者。在EventBus3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING。
  • Publisher 事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。

四种线程模型

EventBus3.0有四种线程模型,分别是:

  • POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
  • MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
  • BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
  • ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。

04 EventBus的基本用法

举个例子,我需要在一个Activity里注册EventBus事件,然后定义接收方法,这跟Android里的广播机制很像,你需要首先注册广播,然后需要编写内部类,实现接收广播,然后操作UI。所以,在EventBus中,你同样得这么做。

自定义一个事件类

public class MessageEvent{ private String message; public MessageEvent(String message){ this.message=message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 

这里有些同学,会有一些疑问,为什么要建立这样一个类,有什么用途。其实这个类就是一个Bean类,里面定义用来传输的数据的类型。

注册事件

@Override
protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); } 

当我们需要在Activity或者Fragment里订阅事件时,我们需要注册EventBus。我们一般选择在Activity的onCreate()方法里去注册EventBus,在onDestory()方法里,去解除注册。

解除注册

@Override
protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } 

发送事件

EventBus.getDefault().post(messageEvent); 

处理事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) { ... } 

前面我们说过,处理消息的方法名字可以随便取。但是需要加一个注解@Subscribe,并且要指定线程模型。

05 EventBus使用实战

以上我们讲了EventBus的基本用法,没有用过的同学也不要担心不会用,小编在这里举个小栗子。

第一步:添加依赖

 compile 'org.greenrobot:eventbus:3.0.0'

第二步:定义消息事件类

public class MessageEvent{ private String message; public MessageEvent(String message){ this.message=message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 

第三步:注册和解除注册

分别在FirstActivity的onCreate()方法和onDestory()方法里,进行注册EventBus和解除注册。

package com.example.lenovo.testapp.ui;import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.example.lenovo.testapp.R; import com.example.lenovo.testapp.event.MessageEvent; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; /** * Created by ZZG on 2018/1/10. */ public class FirstActivity extends AppCompatActivity { private Button mButton; private TextView mText; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_activity); mButton = (Button) findViewById(R.id.btn1); mText = (TextView) findViewById(R.id.tv1); mText.setText("今天是星期三"); EventBus.getDefault().register(this); jumpActivity(); } private void jumpActivity() { mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); } }); } @Subscribe(threadMode = ThreadMode.MAIN) public void Event(MessageEvent messageEvent) { mText.setText(messageEvent.getMessage()); } @Override protected void onDestroy() { super.onDestroy(); if(EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); } } } 

事件处理

在这里,事件的处理线程在主线程,是因为,我要让TextView去显示值。
在 SecondActivity里去进行事件的发送。

package com.example.lenovo.tezs;import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import org.greenrobot.eventbus.EventBus; /** * Created by ZZG on 2018/1/10. */ public class SecondActivity extends AppCompatActivity { private Button mButton2; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_activity); mButton2=(Button) findViewById(R.id.btn2); jumpActivity(); } private void jumpActivity() { mButton2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(new MessageEvent("欢迎大家浏览我写的博客")); finish(); } }); } } 

很简单,当点击按钮的时候,发送了一个事件。

运行程序。

1.PNG

在FirstActivity中,左边是一个按钮,点击之后可以跳转到SecondActivity,在按钮的右边是一个TextView,用来进行结果的验证。

2.PNG

这是SecondActivity,在页面的左上角,是一个按钮,当点击按钮,就会发送了一个事件,最后这个Activity就会销毁掉。

3.PNG

此时我们可以看到,FirstActivity里的文字已经变成了,我们在SecondActivity里设置的文字。

总结

经过这个简单的例子,我们发现EventBus使用起来是如此的方便,当我们的代码量变得很多的时候,使用EventBus后你的逻辑非常的清晰,并且代码之间高度解耦,在进行组件、页面间通信的时候,EventBus是一个不错的选择。

作者:梨子哥
链接:https://www.jianshu.com/p/f9ae5691e1bb
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【转】EventBus 3.0使用详解相关推荐

  1. Android消息传递之EventBus 3.0使用详解

    前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...

  2. EventBus:基本使用详解

    一.简介 EventBus项目:https://github.com/greenrobot/EventBus EventBus 3.0.0 API:http://greenrobot.org/file ...

  3. vue-cli3.0配置详解

    这次给大家带来vue-cli3.0配置详解,使用vue-cli3.0配置的注意事项有哪些,下面就是实战案例,一起来看一下. 新建项目 1 2 3 4 5 6 7 8 # 安装 npm install ...

  4. [转载]AxureRP 7.0部件详解(一)

    转载]AxureRP 7.0部件详解(一) 本文为Axure RT7.0教程,本章主要介绍menu菜单.table表格.Tree Widget 树部件三个部件,后续将持续更新...... Menu 菜 ...

  5. linux rpm安装zabbix,CentOS 7上安装Zabbix Server 3.0 图文详解

    CentOS 7上安装Zabbix Server 3.0 图文详解 1.查看系统信息. cat /etc/RedHat-release CentOS Linux release 7.0.1406 (C ...

  6. Less(v3.9.0)使用详解—变量

    该系列: Less(v3.9.0)使用详解--基本使用 Less(v3.9.0)使用详解--变量 Less(v3.9.0)使用详解--嵌套和父选择器& Less(v3.9.0)使用详解--ex ...

  7. Hadoop3.2.0使用详解

    Hadoop3.2.0使用详解 1.概述 Hadoop3已经发布很久了,迭代集成的一些新特性也是很有用的.截止本篇博客书写为止,Hadoop发布了3.2.0.接下来,笔者就为大家分享一下在使用Hado ...

  8. mvc jquery ajax分页实例,jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解,mvcpagerajax分页...

    jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解,mvcpagerajax分页 简单的两个步骤即可实现分页功能 //回调里面进行业务处理 function lo ...

  9. 华为p4支持鸿蒙功能吗_华为鸿蒙2.0系统支持的手机型号 华为鸿蒙2.0系统详解[多图]...

    华为鸿蒙2.0系统目前已经网上公开招募,还有很多玩家都在问什么手机可以使用,同时大家需要在哪里下载呢,下面一起来看看具体的攻略内容. 华为鸿蒙2.0系统详解 HarmonyOS 2.0手机开发者Bet ...

最新文章

  1. 如何让li中的标签内容横向排列
  2. 用Beamer制作幻灯片(卷二 色彩篇)
  3. 张宏江:开源时代如何解决人的思维孤岛
  4. json 是个什么东西?
  5. 分布式缓存系统 Memcached CAS协议
  6. pytorch指定gpu
  7. vue-cli watch/timer
  8. WebSocket介绍和Socket的区别
  9. shell test
  10. libusb的交叉编译
  11. Internet校验和
  12. 容器技术Docker K8s 36 容器服务ACK基础与进阶-应用与发布管理
  13. 复杂网络-无标度网络matlab代码实现
  14. 红米html查看器,小米 红米【AC2100】一键刷BREED【30秒刷完】小白脑残专用 无需工具TELNET + 检查坏块...
  15. java clh_浅谈Java AQS实现——CLH锁
  16. 下列关于java包装类叙述错误的是,java包装类
  17. 接口测试(python+requests)
  18. 随便记录一下:微信公众号后台管理系统,获取需要扫描的二维码
  19. 程序人生:为什么现在的年轻人看不到希望?
  20. 【cpg控制】Hopf振荡器的一种python实现

热门文章

  1. 2019上海车展展后报告(整车篇)
  2. “万维网之父”发文阐述其下一个网络时代:将数据与应用分离,互联网去中心化正在路上...
  3. 干货 | 加速AI发展!一文了解GPU Computing
  4. DeepMind提出强化学习新算法,教智能体从零学控制
  5. 简评亚洲人工智能发展现状:机遇与挑战并存
  6. 别和 Python 说再见了!!
  7. BCH网络成功发布第一个商业级别的Token
  8. 无法启动MySQL数据库
  9. 简单使用SpringCloud的fegin和熔断hystrix
  10. Android逆向进阶——让你自由自在脱壳的热身运动(dex篇)