一、概述

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

2、基本使用

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

  1. public class AnyEventType {
  2. public AnyEventType(){}
  3. }

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

  1. eventBus.register(this);

(3)发送消息

  1. eventBus.post(new AnyEventType event);

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

  1. public void onEvent(AnyEventType event) {}

(5)解除注册

  1. 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)

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <Button
  7. android:id="@+id/btn_try"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="btn_bty"/>
  11. <TextView
  12. android:id="@+id/tv"
  13. android:layout_width="wrap_content"
  14. android:layout_height="match_parent"/>
  15. </LinearLayout>

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

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context="com.harvic.try_eventbus_1.SecondActivity" >
  7. <Button
  8. android:id="@+id/btn_first_event"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:text="First Event"/>
  12. </LinearLayout>

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

  1. public class MainActivity extends Activity {
  2. Button btn;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. btn = (Button) findViewById(R.id.btn_try);
  8. btn.setOnClickListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. // TODO Auto-generated method stub
  12. Intent intent = new Intent(getApplicationContext(),
  13. SecondActivity.class);
  14. startActivity(intent);
  15. }
  16. });
  17. }
  18. }

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

2、新建一个类FirstEvent

  1. package com.harvic.other;
  2. public class FirstEvent {
  3. private String mMsg;
  4. public FirstEvent(String msg) {
  5. // TODO Auto-generated constructor stub
  6. mMsg = msg;
  7. }
  8. public String getMsg(){
  9. return mMsg;
  10. }
  11. }

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

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

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

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

  1. package com.example.tryeventbus_simple;
  2. import com.harvic.other.FirstEvent;
  3. import de.greenrobot.event.EventBus;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.TextView;
  11. import android.widget.Toast;
  12. public class MainActivity extends Activity {
  13. Button btn;
  14. TextView tv;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. //注册EventBus
  20. EventBus.getDefault().register(this);
  21. btn = (Button) findViewById(R.id.btn_try);
  22. tv = (TextView)findViewById(R.id.tv);
  23. btn.setOnClickListener(new View.OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. // TODO Auto-generated method stub
  27. Intent intent = new Intent(getApplicationContext(),
  28. SecondActivity.class);
  29. startActivity(intent);
  30. }
  31. });
  32. }
  33. @Override
  34. protected void onDestroy(){
  35. super.onDestroy();
  36. EventBus.getDefault().unregister(this);//反注册EventBus
  37. }
  38. }

4、发送消息

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

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

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

  1. package com.example.tryeventbus_simple;
  2. import com.harvic.other.FirstEvent;
  3. import de.greenrobot.event.EventBus;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Button;
  8. public class SecondActivity extends Activity {
  9. private Button btn_FirstEvent;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_second);
  14. btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);
  15. btn_FirstEvent.setOnClickListener(new View.OnClickListener() {
  16. @Override
  17. public void onClick(View v) {
  18. // TODO Auto-generated method stub
  19. EventBus.getDefault().post(
  20. new FirstEvent("FirstEvent btn clicked"));
  21. }
  22. });
  23. }
  24. }

5、接收消息

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

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

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

  1. public void onEventMainThread(FirstEvent event) {
  2. String msg = "onEventMainThread收到了消息:" + event.getMsg();
  3. Log.d("harvic", msg);
  4. tv.setText(msg);
  5. Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
  6. }

完整的MainActiviy代码如下:

  1. package com.example.tryeventbus_simple;
  2. import com.harvic.other.FirstEvent;
  3. import de.greenrobot.event.EventBus;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.TextView;
  11. import android.widget.Toast;
  12. public class MainActivity extends Activity {
  13. Button btn;
  14. TextView tv;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. EventBus.getDefault().register(this);
  20. btn = (Button) findViewById(R.id.btn_try);
  21. tv = (TextView)findViewById(R.id.tv);
  22. btn.setOnClickListener(new View.OnClickListener() {
  23. @Override
  24. public void onClick(View v) {
  25. // TODO Auto-generated method stub
  26. Intent intent = new Intent(getApplicationContext(),
  27. SecondActivity.class);
  28. startActivity(intent);
  29. }
  30. });
  31. }
  32. public void onEventMainThread(FirstEvent event) {
  33. String msg = "onEventMainThread收到了消息:" + event.getMsg();
  34. Log.d("harvic", msg);
  35. tv.setText(msg);
  36. Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
  37. }
  38. @Override
  39. protected void onDestroy(){
  40. super.onDestroy();
  41. EventBus.getDefault().unregister(this);
  42. }
  43. }

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

EventBus的使用,初学EventBus传值的更多相关文章

  1. [EventBus源码解析] EventBus.post 方法详述

    前情概要 上一篇blog我们了解了EventBus中register/unregister的过程,对EventBus如何实现观察者模式有了基本的认识.今天我们来看一下它是如何分发一个特定事件的,即po ...

  2. [EventBus源码解析] EventBus.register 方法详述

    前情概要 在上一篇中,介绍了EventBus的基本使用方法,以及一部分进阶技巧.本篇及以后的几篇blog将会集中解析EventBus.java,看看作者是如何优雅地实现这个看似简单的事件分发/接收机制 ...

  3. Android中的eventBus传值

    第一步:在build.gradle中添加依赖dependencies { compile 'org.greenrobot:eventbus:3.0.0'} 第二步:创建一个 Event类: 注意:en ...

  4. Activity跳转通过EventBus传值问题

    根据阿里发布的Android开发规范:下载地址:https://102.alibaba.com/downloadFile.do?file=1520478361732/Android_v9.pdf Ac ...

  5. android EventBus的简单使用

    今天,简单讲讲Android里关于EventBus的使用. 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解.于是在网上查找了资料,学 ...

  6. vue中eventbus的使用

    eventbus的方法很是简单,我们需要做三步事情: 第一步,我们需要创造一个容器去充当我们的eventbus 第二步,我们需要去抛出,或者说提交我们的事件 第三步,我们去监听我们的那个事件(也许这才 ...

  7. 【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~

    一.写在前面 还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?EventBus 3.0,专注于android的发布.订阅事件总线,让各组件间的消息传递更简单!完美替代Intent,Handl ...

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

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

  9. Android EventBus 3.0.0 使用总结

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6039221.html 本文出自[赵彦军的博客] 前言 EventBus框架 EventBus是一个通用的叫法 ...

随机推荐

  1. 安装universal-ctags

    universal-ctags是exuberant-ctags的替代者,相比gtags可以解析更多的语言,但是其他方面比如操作,数据库的组织方式等就不够好.需要自己编译安装 先用 git clone ...

  2. 摄像头(1)拍照的主要API,权限和特性,判断有没有摄像头的方法

    支持 Android SDK支持操作Android设备内置的照相机.从Android2.3开始,支持操作多个摄像头(主要指前置摄像头和后置照相机).通过照相机可以拍照和录像. 注意事项 是否支持照相机 ...

  3. Oracle命令(一):Oracle登录命令

    1.运行SQLPLUS工具 C:\Users\wd-pc>sqlplus 2.直接进入SQLPLUS命令提示符 C:\Users\wd-pc>sqlplus /nolog 3.以OS身份连 ...

  4. 【HDOJ】3828 A + B problem

    显然需要贪心,重叠越长越好,这样最终的串长尽可能短.需要注意的是,不要考虑中间结果,显然是个状态dp.先做预处理去重,然后求任意一对串的公共长度. /* 3828 */ #include <io ...

  5. Managed C++中使用Nullable<T>

    非null值表示和C#的用法一样. Nullable<int> a = 1; null值的表示: Nullable<int> a = Nullable<int>() ...

  6. Anti-pattern(反面模式)

    转自维基百科 http://zh.wikipedia.org/wiki/%E5%8F%8D%E9%9D%A2%E6%A8%A1%E5%BC%8F 在软件工程中,一个反面模式(anti-pattern或 ...

  7. 【jQuery】

    TryjQuery:jQuery官方推出的教学视频http://blog.jobbole.com/37699/ jQuery 1.11 / 2.1 beta 版发布,全面支持异步模块加载  √http ...

  8. Erlang入门(一)

    读erlang.org上面的Erlang Course四天教程1.数字类型,需要注意两点1)B#Val表示以B进制存储的数字Val,比如 7> 2#101.5 二进制存储的101就是10进制的5 ...

  9. 奋战5个小时解决诡异的PHP--“图像XX因其本身有错无法显示”的问题

    昨天终于将客户的一个网站迁移至虚拟主机上,满怀希望的敲入网址.唰的一声,网站很轻松的被打开了. 心里那个高兴啊~~~ 咦,怎么产品图片都没有显示出来.一块块都是空白.敲入img src对应的地址,看看 ...

  10. 什么是MBeanServer

    什么是MBeanServer MBeanServer是一个包含所有注册MBean的仓库.它是JMX代理层的核心.JMX1.0规范提供一个接口叫 javax.management.MBeanServer ...