什么是EventBus

EventBus是一个 发布/订阅 模式的消息总线库,它简化了应用程序内各组件间、组件与后台线程间的通信,解耦了事件的发送者和接收者,避免了复杂的、易于出错的依赖及生命周期问题,可以使我们的代码更加简洁、健壮。EventBus 用于各组件通信,那么用于 fragment 之间的通信就非常合适了。

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. }

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. }

Android之利用EventBus进行消息传递的更多相关文章

  1. Android之利用EventBus进行数据传递

    在项目中,不可避免的要在两个页面之间进行数据的传递,就算不传递,也需要进行刷新之类的,我们根据Google提供的库类方法,也是可以做的,主要有广播broadcastreceiver,startacti ...

  2. android firmware 利用UDP socket发送Magic Packet--python版本

    android firmware 利用UDP socket发送Magic Packet--python版本 #!/usr/bin/python import sys, time from struct ...

  3. android firmware 利用UDP socket发送Magic Packet--c语言版本

    android firmware 利用UDP socket发送Magic Packet 1 Magic Packet格式: 6个0xFF + 16个Dst Mac Address 2 代码需要设置目的 ...

  4. Android下利用Bitmap切割图片

    在自己自定义的一个组件中由于需要用图片显示数字编号,而当前图片就只有一张,上面有0-9是个数字,于是不得不考虑将其中一个个的数字切割下来,需要显示什么数字,只需要组合一下就好了. 下面是程序的关键代码 ...

  5. Android中利用Handler实现消息的分发机制(三)

    在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而假设在子线程中须要去 ...

  6. android 下 利用webview实现浏览器功能

    android 下 利用webview实现浏览器功能(一): 1.界面添加WEBVIEW控件. 2.在界面.JAVA代码页面(protected void onCreate(Bundle savedI ...

  7. Android中利用ant进行多渠道循环批量打包

    公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android ...

  8. 【Android】利用安卓的数据接口、多媒体处理编写内存卡Mp3播放器app

    通过调用安卓的MediaPlayer能够直接完毕Mp3等主流音频的播放,同一时候利用ContentResolver与Cursor能够直接读取安卓内在数据库的信息.直接获取当前sdcard中全部音频的列 ...

  9. Android开发利用shareSDK等第三方分享,弹出的是英文名称。例如Genymotion模拟器

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发利用shareSDK等第三方分享,弹出的是英文名称.例如Genymotion模拟器就 ...

随机推荐

  1. C_动态库|静态库

    动态库 动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据 dll 并不是所有数据都能被访问到,必须要进行导出 动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用 生成动态 ...

  2. CAD使用GetXData读数据(网页版)

    主要用到函数说明: MxDrawEntity::GetXData 返回实体的扩展数据. js代码实现如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...

  3. Java基础(六)--枚举Enum

    枚举: 刚开始项目中没怎么用过,只知道能够实现作为项目中类似定义Constant的功能,然后知道枚举实现的单例模式几乎是最优雅的,所以, 想要深入完整的了解一下 1.基本特性: Enum.values ...

  4. 文艺平衡树-splay的区间操作

    真的是个神题,蒟蒻表示无力吐槽.刚开始以为是一个板子题,看着题解打了一遍,大概也理解了他是怎么实现的,然后我就去做别的题了,然后就在Three_D大佬的询问下蒙*了.最后还是问的nc哥,并思考了一个中 ...

  5. Python学习-比较运算符和逻辑运算符

    比较运算符 == 等于 - 比较对象是否相等 print(3 == 4); //False != 不等于 - 比较两个对象是否不相等 print(3 != 4); // True    <> ...

  6. ganglia371 on suse11sp3

    参考https://my.oschina.net/duangr/blog/181585 1.确认依赖包是否已安装 确认命令:rpm -qa  如下为适合suse11sp3的依赖包版本 apr: lib ...

  7. VM 与 与 Linux 的安装

    [VMWare  安装] 输入后, [CentOS ] 1  检查 BIOS  虚拟化 2.新建虚拟机 3.新建虚拟机向导 4创建虚拟空盘 5  安装 Linux  系统对应的 CentOS 6  虚 ...

  8. Linux下汇编语言学习笔记71 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  9. 次小生成树 判断 unique MST

    Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spann ...

  10. Java获取系统环境变量(System Environment Variable)和系统属性(System Properties)以及启动参数的方法

    系统环境变量(System Environment Variable): 在Linux下使用export $ENV=123指定的值.获取的方式如下: Map<String,String> ...