Android事件总线分发库EventBus的简单讲解与实践


导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。反正能帮助我们快速开发,这个确实是个好东西,其实鸿洋大神已经对源码作了一个较全面的剖析了

我这里就简单的聊聊怎么去使用和实践了,在这里,要感谢一下开原作者,也就是《Android源码设计模式解析和实战》的作者何红辉

EventBus已经更新到了3.0了,也优化得更多好了,推荐使用3.0及以上版本,这里先放上一张GitHub上的介绍图

好的,我们一步步来分析这张图

一.概念

既然是个库,我们首先要做的,肯定是引入他的依赖了

 compile 'org.greenrobot:eventbus:3.0.0'

如果是Eclipse,那就自行去Github上下载jar包添加到libs目录下

这里我们要明白一个概念,就是事件总线管理,明白了事件总线管理,你就知道这个库的妙用了,我们分三点来概述

  • 将事件放在队列里,用于管理和分发
  • 保证应用的各个部分之间高效的通信及数据,事件分发
  • 模块间的解耦

当然啦,这样说可能有点笼统,我们再来分析一下,关于事件总线,一共四个部分

  • 发布者
  • 订阅者
  • 事件
  • 总线

这也就迎合我们事件总线的思想了,订阅者可以订阅多个事件,发布者也可以发布任何事件,发布者同时也可以是订阅者,他的步骤

  • 订阅
  • 注册
  • 发布
  • 取消注册

现在是不是对EventBus有一个大概的轮廓啦?现在我们理解这张图就简单多了,发布者把事件发布到总线里面再进行分发

二.讲解

我们按照流程来

1.注册

 //注册
 EventBus.getDefault().register(this);

一句话就注册,当然,他里面不光可以传上下文,还可以传类和事件订阅参数

2.取消注册

 @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消注册
        EventBus.getDefault().unregister(this);
    }

取消注册同样的,里面也可以和注册一样传递参数,我们后面详细说

3.发布

发布有两种

  • 直接发布
  • 滞留发布
 //直接发布,接收对象
EventBus.getDefault().post("发布");
 //滞留发布
EventBus.getDefault().postSticky("滞留发布");

4.订阅处理数据

这也是他的一个优势的地方,在3.0之前的版本,我们是这样的

//主线程事件处理
public void onEvent(MessageEvent event) {
        log(event.message);
    }

//交互式线程事件处理
public void onEventMainThread(MessageEvent event) {
        textField.setText(event.message);
    }

//后台线程处理
public void onEventBackgroundThread(MessageEvent event) {
        saveToDisk(event.message);
    }

3.0之后,我们看官方文档

事件处理就需要这样使用了

   /*
    *UserEvent需要自己定义
    */

    //在ui线程执行
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void onUserEvent(UserEvent event) {
    }

    //在后台线程执行
    @Subscribe(threadMode = ThreadMode.BackgroundThread)
    public void onUserEvent(UserEvent event) {
    }

    //强制在后台执行
    @Subscribe(threadMode = ThreadMode.Async)
    public void onUserEvent(UserEvent event) {
    }

    //默认方式, 在发送线程执行
    @Subscribe(threadMode = ThreadMode.PostThread)
    public void onUserEvent(UserEvent event) {
    }

我们可以注解在方法名上面标记,Subscribe是订阅者的意识,我们定义一个threadMode ,四种模式

  • MainThread
  • BackgroundThread
  • Async
  • PostThread

大意就是这样,不知道大家理解了多少?总的来说,就是注册了之后,就可以,比如我这边发送一个消息数据,你那边就可以接收了

三,实践

我们直接来一个小例子吧,例子也是非常的简单,在一个地方发送一个数据消息事件,另一个地方去接收,这个应该不难,大家都知道做,我们新建一个工程——EventBus

我们首先注册,在把取消注册绑定在onDestroy()上,不多说,这里我们的主布局没什么东西,一个按钮点击发送,一个textview去接收

layout_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="15dp"
    android:gravity="center"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送事件" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:textColor="@color/colorAccent"
        android:textSize="20sp" />

</LinearLayout>

我们还需要一个实体类去保存数据

UserEvent

package com.lgl.eventbus;

/**
 * 实体类
 * Created by lgl on 2016/5/9.
 */
public class UserEvent {

    /**
     * 这里你传递什么类型你就写什么类型
     */

    //文本
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

接着,我们在Button的点击事件中去发送我们的自定义消息

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_send:
                //发送自定义消息
                UserEvent event = new UserEvent();
                event.setText("我是萌哒哒的消息!");
                EventBus.getDefault().post(event);
                break;
        }
    }

然后我们在主线程汇总接收这个消息


    //主线程接收消息
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onUserEvent(UserEvent event) {
        //如果多个消息,可在实体类中添加type区分消息
        tv_content.setText(event.getText());
    }

这样一个简单的事件订阅,接收就完成了,我们来看一下效果

这里我所讲的可能稍微简单点,但是EventBus真的是一个很容易上手,又强大的库,如果细心又爱专研的同学去github上看一下,也就大概的了解了一个思路,我作为一个老司机,也只是抛砖引玉了


Demo下载:http://download.csdn.net/detail/qq_26787115/9514941

我的群,通往Android的神奇之旅 :555974449,欢迎大家进来交流技术!

Android事件总线分发库EventBus3.0的简单讲解与实践的更多相关文章

  1. 45、Android事件总线分发库的使用

    事件总线分发库EventBus和Otto的简介及对比 什么是事件总线管理: a.将事件放到队列里,用于管理和分发b.保证应用的各个部分之间高效的通信及数据.事件分发c.模块间解耦 Event Bus是 ...

  2. Android事件总线(一)EventBus3.0用法全解析

    前言 EventBus是一款针对Android优化的发布/订阅事件总线.简化了应用程序内各组件间.组件与后台线程间的通信.优点是开销小,代码更优雅,以及将发送者和接收者解耦.如果Activity和Ac ...

  3. Android事件总线(二)EventBus3.0源码解析

    1.构造函数 当我们要调用EventBus的功能时,比如注册或者发送事件,总会调用EventBus.getDefault()来获取EventBus实例: public static EventBus ...

  4. Android事件的分发机制

    在分析Android事件分发机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件,没有子布局的,如Button.TextView. ViewGroup继承自 ...

  5. 【第三篇】学习 android 事件总线androidEventbus之发布事件,子线程中接收

    发送和接收消息的方式类似其他的发送和接收消息的事件总线一样,不同的点或者应该注意的地方: 1,比如在子线程构造方法里面进行实现总线的注册操作: 2,要想子线程中接收消息的功能执行,必须启动线程. 3, ...

  6. 【第三篇】学习 android 事件总线androidEventbus之list数据事件的传递,发送list数据事件到另外一个Activity

    这个和普通的事件总线的发送接收一样. package com.example.mysimpleeventbus; import java.util.ArrayList; import java.uti ...

  7. 【第一篇】学习 android 事件总线androidEventbus之sticky事件的传递

    最近再看eventbus相关代码,首先从使用开始,后期再从源码角度分析eventbus.使用Demo后期公布到github上去. 使用的框架地址:https://github.com/bboyfeiy ...

  8. Android事件总线EventBus详解

    顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码 ...

  9. Android事件总线还能怎么玩?

    作者简介:何红辉,Android工程师,现任职于友盟. 顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件 ...

随机推荐

  1. 操作系统内核Hack:(二)底层编程基础

    操作系统内核Hack:(二)底层编程基础 在<操作系统内核Hack:(一)实验环境搭建>中,我们看到了一个迷你操作系统引导程序.尽管只有不到二十行,然而要完全看懂还是需要不少底层软硬件知识 ...

  2. 安卓高级Fresco图片框架的时候

    Fresco:2015FaceBook推出的 及其强大 支持webp图片格式 和渐进式图片加载 中文文档 使用方法 引入依赖 点击查看具体教程 基本使用步骤 在布局中使用其标签 <com.fac ...

  3. Ajax原理学习

    一.AJAX 简介 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. A ...

  4. Gi之(二)基础命令

    三个工作区域 使用Git之前,首先要弄清Git的三个管理区域,有助于理解Git的运行原理,以及每个Git命令对文件造成的影响. 对于任何一个文件,在本地的Git内部都有三种状态: l   已修改(mo ...

  5. 20160213.CCPP体系详解(0023天)

    程序片段(01):全排列.c 内容概要:全排列密码库 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <std ...

  6. 给现有的word和pdf加水印

    iTextSharp简单生成pdf和操作pdf添加水印 给word加水印,利用的是aspose.words

  7. nginx+tomcat负载均衡和session复制

    本文介绍下传统的tomcat负载均衡和session复制. session复制是基于JVM内存的,当然在当今的互联网大数据时代,有更好的替代方案,如将session数据保存在Redis中. 1.安装n ...

  8. PHP和MySQL Web开发学习笔记介绍

    前言 从2016年2月1日开始,之后的几个月左右的时间里,我会写一个系列的PHP和MySQL Web开发的学习笔记.我之前一直从事Java语言的开发工作,最近这段时间非常想学习一门语言,就选择了PHP ...

  9. Findbugs异常总汇

    FindBugs是基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug,主要检查bytecode中的bug patterns,如NullPoint空指针检查 ...

  10. [Flask]学习杂记--模板

    这个学习杂记主要不是分享经验,更多是记录下falsk的体验过程,以后做东西在深入研究,因为django之前用的时间比较长,所以很多概念都是一看而过,做个试验了解下flask的功能. flask中使用是 ...