Android之利用EventBus发送消息传递示例

一、概述

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

1、下载EventBus的类库

源码:EventBus_jb51.rar

2、基本使用

(1)自定义一个类,可以是空类,比如:

public class AnyEventType {
  public AnyEventType(){}
 } 

(2)在要接收消息的页面注册:

eventBus.register(this); 

(3)发送消息

eventBus.post(new AnyEventType event); 

(4)接受消息的页面实现(共有四个函数,各功能不同,这是其中之一,可以选择性的实现,这里先实现一个):

public void onEvent(AnyEventType event) {} 

(5)解除注册

eventBus.unregister(this); 

顺序就是这么个顺序,可真正让自己写,估计还是云里雾里的,下面举个例子来说明下。

首先,在EventBus中,获取实例的方法一般是采用EventBus.getInstance()来获取默认的EventBus实例,当然你也可以new一个又一个,个人感觉还是用默认的比较好,以防出错。

二、实战

先给大家看个例子:

当击btn_try按钮的时候,跳到第二个Activity,当点击第二个activity上面的First Event按钮的时候向第一个Activity发送消息,当第一个Activity收到消息后,一方面将消息Toast显示,一方面放入textView中显示。

按照下面的步骤,下面来建这个工程:

1、基本框架搭建

想必大家从一个Activity跳转到第二个Activity的程序应该都会写,这里先稍稍把两个Activity跳转的代码建起来。后面再添加EventBus相关的玩意。

MainActivity布局(activity_main.xml)

<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:orientation="vertical"> 

 <Button
  android:id="@+id/btn_try"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="btn_bty"/>
 <TextView
  android:id="@+id/tv"
  android:layout_width="wrap_content"
  android:layout_height="match_parent"/> 

</LinearLayout>

新建一个Activity,SecondActivity布局(activity_second.xml)

<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:orientation="vertical"
 tools:context="com.harvic.try_eventbus_1.SecondActivity" > 

 <Button
  android:id="@+id/btn_first_event"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="First Event"/> 

</LinearLayout>

MainActivity.java (点击btn跳转到第二个Activity)

public class MainActivity extends Activity { 

 Button btn; 

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

  btn = (Button) findViewById(R.id.btn_try); 

  btn.setOnClickListener(new View.OnClickListener() { 

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(getApplicationContext(),
      SecondActivity.class);
    startActivity(intent);
   }
  });
 } 

}

到这,基本框架就搭完了,下面开始按步骤使用EventBus了。

2、新建一个类FirstEvent

package com.harvic.other; 

public class FirstEvent { 

 private String mMsg;
 public FirstEvent(String msg) {
  // TODO Auto-generated constructor stub
  mMsg = msg;
 }
 public String getMsg(){
  return mMsg;
 }
} 

这个类很简单,构造时传进去一个字符串,然后可以通过getMsg()获取出来。

3、在要接收消息的页面注册EventBus:

在上面的GIF图片的演示中,大家也可以看到,我们是要在MainActivity中接收发过来的消息的,所以我们在MainActivity中注册消息。

通过我们会在OnCreate()函数中注册EventBus,在OnDestroy()函数中反注册。所以整体的注册与反注册的代码如下:

package com.example.tryeventbus_simple; 

import com.harvic.other.FirstEvent; 

import de.greenrobot.event.EventBus;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; 

public class MainActivity extends Activity { 

 Button btn;
 TextView tv; 

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

  btn = (Button) findViewById(R.id.btn_try);
  tv = (TextView)findViewById(R.id.tv); 

  btn.setOnClickListener(new View.OnClickListener() { 

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(getApplicationContext(),
      SecondActivity.class);
    startActivity(intent);
   }
  });
 }
 @Override
 protected void onDestroy(){
  super.onDestroy();
  EventBus.getDefault().unregister(this);//反注册EventBus
 }
}

4、发送消息

发送消息是使用EventBus中的Post方法来实现发送的,发送过去的是我们新建的类的实例!

EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));

完整的SecondActivity.Java的代码如下:

package com.example.tryeventbus_simple; 

import com.harvic.other.FirstEvent; 

import de.greenrobot.event.EventBus;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; 

public class SecondActivity extends Activity {
 private Button btn_FirstEvent; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_second);
  btn_FirstEvent = (Button) findViewById(R.id.btn_first_event); 

  btn_FirstEvent.setOnClickListener(new View.OnClickListener() { 

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    EventBus.getDefault().post(
      new FirstEvent("FirstEvent btn clicked"));
   }
  });
 }
}

5、接收消息

接收消息时,我们使用EventBus中最常用的onEventMainThread()函数来接收消息,具体为什么用这个,我们下篇再讲,这里先给大家一个初步认识,要先能把EventBus用起来先。

在MainActivity中重写onEventMainThread(FirstEvent event),参数就是我们自己定义的类:

在收到Event实例后,我们将其中携带的消息取出,一方面Toast出去,一方面传到TextView中;

public void onEventMainThread(FirstEvent event) { 

 String msg = "onEventMainThread收到了消息:" + event.getMsg();
 Log.d("harvic", msg);
 tv.setText(msg);
 Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}

完整的MainActiviy代码如下:

package com.example.tryeventbus_simple; 

import com.harvic.other.FirstEvent; 

import de.greenrobot.event.EventBus;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; 

public class MainActivity extends Activity { 

 Button btn;
 TextView tv; 

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

  EventBus.getDefault().register(this); 

  btn = (Button) findViewById(R.id.btn_try);
  tv = (TextView)findViewById(R.id.tv); 

  btn.setOnClickListener(new View.OnClickListener() { 

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(getApplicationContext(),
      SecondActivity.class);
    startActivity(intent);
   }
  });
 } 

 public void onEventMainThread(FirstEvent event) { 

  String msg = "onEventMainThread收到了消息:" + event.getMsg();
  Log.d("harvic", msg);
  tv.setText(msg);
  Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
 } 

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

好了,到这,基本上算初步把EventBus用起来了,下篇再讲讲EventBus的几个函数,及各个函数间是如何识别当前如何调用哪个函数的。

源码地址:EventBus_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-02-06

Android EventBus 3.0.0 使用总结(必看篇)

前言 EventBus框架 EventBus是一个通用的叫法,例如Google出品的Guava,Guava是一个庞大的库,EventBus只是它附带的一个小功能,因此实际项目中使用并不多.用的最多的是greenrobot/EventBus,这个库的优点是接口简洁,集成方便,但是限定了方法名,不支持注解.另一个库square/otto修改自 Guava ,用的人也不少.所以今天我们研究的目标是greenrobot的EventBus. EventBus 简介 1.EventBus3.0.0 是最新的

Android中使用开源框架eventbus3.0实现fragment之间的通信交互

1.概述 在之前的博文中简单介绍过如何实现fragment之间的信息交互:<Android中Fragment与Activity之间的交互(两种实现方式)>,今天继续给大家介绍一种可以实现此效果的另外一种方式EventBus.(相比于handler,接口回调,bundle传参,这个简单好用到哭) EventBus是Android下高效的发布/订阅事件的消息总线.作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment.Activity.Service.线程

Android 消息分发使用EventBus的实例详解

Android 消息分发使用EventBus的实例详解 1. AndroidStudio使用 dependencies { //最新版本 compile 'org.greenrobot:eventbus:3.0.0' //可以翻倍提高EventBus使用效率 provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1' } 2. 在基类Activity中配置 /** * Activity基类 */ protected Eve

Android 中 EventBus 的使用之多线程事件处理

在这一系列教程的最后一篇中,我想谈谈GR的EventBus,在处理多线程异步任务时是多么简单而有效. AsyncTask, Loader和Executor-- 拜托! Android中有很多种执行异步操作的方法(指平行于UI线程的).AsyncTask对于用户来说是最简单的一种机制,并且只需要少量的设置代码即可.然而,它的使用是有局限的,正如Android官方文档中所描述的: AsyncTask被设计成为一个工具类,在它内部包含了Thread和Handler,但它本身并不是通用线程框架的一部分.

Android实现EventBus登录界面与传值(粘性事件)

本文实例为大家分享了Android实现EventBus登录界面与传值的具体代码,供大家参考,具体内容如下 展示效果 添加EventBus导入依赖 compile 'org.greenrobot:eventbus:3.0.0' 主MainActivity方法 public class MainActivity extends AppCompatActivity { private EditText username,password; private Button btn_go; private

浅谈Android中多线程切换的几种方法

我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式. 我们先回顾一下Java多线程的几个基础内容,然后再分析总结一些经典代码中对于线程切换的实现方式. 几点基础 多线程切换,大概可以切分为这样几个内容:如何开启多个线程,如何定义每个线程的任务,如何在线程之间互相通信. Thread Thread可以解决开启多个线程的问题. Thread是Java中实现多线程的线程类,每个Thread对象都可以启动一个新的线程,注

Android中父View和子view的点击事件处理问题探讨

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是ViewG

Android中Handler消息传递机制

Handler 是用来干什么的? 1)执行计划任务,可以在预定的时间执行某些任务,可以模拟定时器 2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以在你的子线程中拿到父线程中创建的Handler 对象,就可以通过该对象向父线程的消息队列发送消息了.由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面. 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发

Android中单例模式的一些坑小结

前言 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点." 而我对单例的理解是,在可控的范围内充当全局变量的作用,就相当于C语言中一个全局结构体. 首先来看这样一个单例,稍微有点经验的同学可能都会说,这样的单例是非线程安全的.要加个volatile关键字才可以. class Singleton{ private static Singleton singleton; private Singleton(

Android中的二维码生成与扫描功能

0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维码生成和扫描的功能. 1.    Zxing的使用 从github上下载项目后,可以看到整体代码结构如下: 我们只需将Zxing包下的所有代码copy一份到我们的项目中去,除了这些还需要zxing的jar包,最后相应的资源文件,包括values文件下的ids文件.raw文件中的资源文件(可以替换).

详解Android中解析XML的方法

XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法. 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器,下面,我将一一向大家详细介绍. SAX解析器: SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事

Android中invalidate()和postInvalidate() 的区别及使用方法

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调用inval