Android之利用EventBus进行消息传递

什么是EventBus

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

1、基本框架搭建

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

MainActivity布局(activity_main.xml)

[html] view plain copy

  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)

[html] view plain copy

  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)

[java] view plain copy

  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

[java] view plain copy

  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()函数中反注册。所以整体的注册与反注册的代码如下:

[java] view plain copy

  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方法来实现发送的,发送过去的是我们新建的类的实例!

[java] view plain copy

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

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

[java] view plain copy

  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中;

[java] view plain copy

    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. }
时间: 2024-10-06 10:13:01

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

Android之利用EventBus进行数据传递

在项目中,不可避免的要在两个页面之间进行数据的传递,就算不传递,也需要进行刷新之类的,我们根据Google提供的库类方法,也是可以做的,主要有广播broadcastreceiver,startactivity方法或者是application实例等等,都是可以工作的(只要实现了都是好样的,毕竟功能实现优先于代码结构?). 但是同时存在一个问题,那就是代码的耦合度高了,例如广播,你还要写一个内部类,继承自系统的广播类,然后还需要在进入页面之前进行new和注册广播,然后不要用的时候,还需要一个个的反注

Android 解耦利器 EventBus

Andorid 开发过程中总会遇到各个模块耦合问题,使用EventBus是一种解耦方式. EventBus 源代码下载地址 https://github.com/greenrobot/EventBus 如果一个ListView展示的内容需要到网络上请求该数据,那么该业务需要如下几个步骤: 1.发送请求拼装URL---> 2.发送请求--> 3.得到数据---> 4.渲染数据 //使用传统的Handler和线程 final Integer GET_DATA= 1001; final Han

Android中利用SharedPreferences保存信息

package com.example.sharepreferen; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.vi

Android下利用SQLite数据库实现增删改查

1: 首先介绍如何利用adb查看数据库 1: adb shell 2: cd /data/data/包名/databases 3:  sqlite3 数据库 4   接下来就可以进行数据库的sql语法的使用了 bean对象: public class Person { private int id; private String name; private String number; } 数据库的创建以及表的创建: package com.example.db; import android.

如何在android中利用Theme设置application 的所有listview的style?~

今天看VLC的源代码,发现一个很神奇的东西 所有listview的点击效果背景色都是橘黄色 花了点时间找了一下看看怎么实现的. 首先,定义一个<selector> like this: <selector> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="@color/

Android中利用命令行进行截屏并导出到电脑上

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/27819525 大多数人最常用的截屏方法可能就是利用手机的快捷按键了,但是那样如果要导入到电脑中效率会比较低.实际上有更好的截屏方式,最简单的当然就是利用Eclipse中的DDMS进行截屏了,点击"Screen Capture"按钮后等待10多秒,然后就可直接利用Save按钮保存到电脑中. 显然,由于要进行图片显示的原因,在DDMS中会

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

在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而如果在子线程中需要去使用Handler的时候,我们就需要显式地去调用Looper的 prepare方法和loop方法,从而为子线程创建其唯一的Looper. 具体代码如下: class LooperThread extends Thread { public Handler mHandler; public void run()

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

android 下 利用webview实现浏览器功能: 1.界面添加WEBVIEW控件. 2.在界面.JAVA代码页面(protected void onCreate(Bundle savedInstanceState) 方法中)添加如下代码: //#region WebView wb=(WebView)findViewById(R.id.Wb_Main); //设置WebView属性,能够执行Javascript脚本 wb.getSettings().setJavaScriptEnabled(

【Android】利用AutoCompleteTextView控件联系人自动补全与根据联系人姓名查询电话

自动补全功能是app比较友好的功能之一,但利用AutoCompleteTextView自动补全文本框控件完成起来并不简单,因为其中涉及到AutoCompleteTextView填充数据的适配器,与AutoCompleteTextView的监听器.同时还需要利用ContentResolver去查找设备的通讯录,当然,这与<[Android]利用安卓的数据接口.多媒体处理编写内存卡Mp3播放器app>(点击打开链接)中遍历MP3与<[Android]Sqlite数据库增删改查>(点击打