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

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

(0)

相关推荐

  • 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 的使用之多线程事件处理

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

  • 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发送消息传递示例

    一.概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅.以及将发送者和接收者解耦. 1.下载EventBus的类库 源码:EventBus_jb51.rar 2.基本使用 (1)自定义一个类,可以是空类,比如: public class AnyEventType { public AnyEventType(){} }

  • 利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: utf-8 -*- import time import sys import logging import smtplib import socket import signal import ConfigParser from datetime import datetime from email

  • Android 中利用 ksoap2 调用 WebService的示例代码

    去年刚刚工作的时候,第一个项目是要访问 WebService.由于没有接触过,查了很多资料,在别人代码的基础上稍微修改了一下,总算满足了自己的需求.最近整理电脑的时候,发现了这个 WebService 的访问类,怕哪一天需要的时候找不到了,干脆写在博客上吧,也给需要的人提供一个参考. 1.下载 ksoap2 的 jar 文件 下载地址:ksoap2-android-assembly-3.6.1-jar-with-dependencies.jar 下载完成后依赖到自己的项目中即可. 2.封装网络访

  • Android开发之注册登录方法示例

    本文所述,继续上一篇关于Android端向服务器端发送数据的方法进一步完善注册登录的方法,由于版本问题出现一点瑕疵,今天经过调试已经解决,在这里给大家介绍一下. 在Android4.0以后版本的对于网络权限要求变得严格,致使上一篇所述的案例无法将数据发送到服务器端,当你一点击发送数据,Android控制台就会报错,错误当然是很让人头疼,基本上都是关于http的错误,所以可以肯定是Android虚拟机向服务器发送数据时出现了错误,经过一番检查与测试后才知道,4.0之后的版本,主线程中不允许调用网络

  • Android实现读取NFC卡卡号示例

    Android实现读取NFC卡卡号示例,具体如下: 1.权限 <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> 2.注册(静态) <intent-filter> <action andro

  • Android使用GridView实现日历功能示例(详细代码)

    Android使用GridView实现日历功能示例,代码有点多,发个图先: 如果懒得往下看的,可以直接下载源码吧,最近一直有人要,由于时间太久了,懒得找出来整理,今天又看到有人要,正好没事就整理了一下 源码下载.... 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an

  • Android 给图片加上水印的示例代码(支持logo+文字)

    本文介绍了Android 给图片加上水印的示例代码(支持logo+文字),分享给大家,具体如下: 现在我们想要往图片上打上水印,该水印应符合这样的需求的: 支持logo+文字: 文字信息支持多行展示: 用户可以选择水印在图片上的生成位置(左上.右上.右下和左下). 粗略的结构图低配版大概就长这样... 水印结构图.png 现在提供这样的一种思路去实现这一个需求,我们可以通过自定义一个view,view的布局中包含logo.公司名称和相关信息,这个view就是我们要打上图片的水印. 这样的一个vi

  • Android编程之View简单学习示例

    本文实例讲述了Android编程之View简单学习示例.分享给大家供大家参考,具体如下: View,是Android的一个超类,这个类几乎包含了所有的屏幕类型.每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展. 在游戏开发中叶可以自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要.在Android中,任何一个View类都只需重写onDraw 方法来实现界面显示,自定义的视图可以是复杂的3D实现,也可以是非常简单的文本形式等. 游戏的核心是不断地绘图和刷新界面,An

  • Android实现强制下线功能的示例代码

    一.回顾 上次连载写了两个类,一个类ActivityCollector.java用于管理所有的活动:一个类是BaseActivity.java作为所有活动的父类: 还有一个放在layout目录中的登录界面login.xml 二.登录页面的活动 接下来写一个登录页面的活动,继承自BaseActivity.java package com.example.broadcastbestpractice; import android.content.Intent; import android.os.B

  • Android路由框架ARouter的使用示例

    目录 一.添加依赖和初始化框架 1.添加依赖 1.1.java版本的依赖 1.2.kotlin版本的依赖 2.初始化SDK 二.ARouter的简单使用 1.界面跳转 1.1.Activity界面跳转 1.2.获取fragment实例 1.3.注意事项 2.携带基本参数的界面跳转 3.携带对象的界面跳转 3.1.携带序列化对象的界面跳转 3.2.携带无序列化对象的界面跳转 3.3.携带集合和数组的界面跳转 4.界面跳转回调 5.未用到的知识点 一.添加依赖和初始化框架 1.添加依赖 在需要使用A

随机推荐