本文介绍EventBus的基本使用,以及用于Fragment和Activity之间通信。 
github地址: https://github.com/greenrobot/EventBus 版本是 EventBus-2.4.0 release 
EventBus是基于订阅和发布的一种通信机制,使用流程如下:

  • 实例化EventBus对象
  • 注册订阅者
  • 发布消息
  • 接受消息

对应代码

EventBus eventBus = new EventBus();
eventBus.register(subscriber object);//注册订阅者
订阅者对象中必须有 onEvent public 方法
public void onEvent(Object event){
//接收消息
}
eventBus.post(event);//发送消息

应用到Activity和Fragment中

因为订阅者必须有onEvent方法,因此我们创建一个基类让onEvent方法作为抽象方法

public abstract class BaseFragment extends Fragment {

    public BaseFragment() {
} public abstract void onEvent(MyEvent eventData); }

MainActivity

public class MainActivity extends FragmentActivity  {

    public Button btn;
public EventBus eventBus; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
eventBus = new EventBus(); FragmentManager fm = getSupportFragmentManager();
MyFragment myFragment = new MyFragment();
fm.beginTransaction().replace(R.id.container, myFragment).commit(); eventBus.register(myFragment);//注册订阅者 MyFragment btn.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
List<String> list = new ArrayList<String>();
list.add("test string");
MyEvent myEvent = new MyEvent();
myEvent.eventType = ;
myEvent.data = list;
eventBus.post(myEvent);//发布消息 myEvent = new MyEvent();
myEvent.eventType = ;
myEvent.data = new MyCallBack();//接口回调作为引用
eventBus.post(myEvent);//发布消息
}
}); } //此时MainActivity作为订阅者
public void onEvent(MyEvent event) {
Log.d("", "onEvent >> callback main>>>" + event.data);
} //回调接口也可以做为事件数据
class MyCallBack implements DataCallBack { @Override
public void onCallback(MyEvent eventData) {
Log.d("", "eventData >>>> " + eventData);
} }
}

封装的消息MyEvent

public class MyEvent {
public MyEvent() {
}
public int eventType;//可能类型有很多种,数据也不一样
public Object data;//数据对象 }

MyFragment

public class MyFragment extends BaseFragment {

    private DataCallBack actCallback;
private EventBus eventBus; public MyFragment() {
setHasOptionsMenu(true);
eventBus = new EventBus();
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, null);
} @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
view.findViewById(R.id.call).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
if (actCallback != null) { //得到接口后 回调一下
MyEvent event = new MyEvent();
event.data = "this is fragment:" + MyFragment.this;
actCallback.onCallback(event);//调用回调
}
}
});
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getActivity() != null) {
eventBus.register(getActivity());//事件订阅者注册,订阅者为MainActivity
}
} @Override
public void onEvent(MyEvent event) {
int type = event.eventType;
if (type == ) {
Log.d("", "onEvent type 1:" + event.data);
}
else if (type == ) {
Log.d("", "onEvent type 2:" + (event.data instanceof DataCallBack));
if (event.data instanceof DataCallBack) {
actCallback = ((DataCallBack) event.data);//得到回调 //发消息给MainActivity
MyEvent event2 = new MyEvent();
event2.data = "call main activity method";
eventBus.post(event2);//发布消息
}
}
}
}

一般让Fragment调用Activity的方法有一下几种

  • 创建Fragment的时候把MainActivity引用传给Fragment,其实通过getActivity()也能获取到实例
  • 创建Fragment的时候传入一个Handler实例,在Fragment中sendMessage也是可以的
  • 创建Fragment的时候传入一个实例化接口,作为回调

我觉得用接口的方式更加好,耦合性算是比较低的一种。当Fragment pop后 getActivity()获取的引用为NULL,传入Handler实例是可以的,但有些时候你可能用不上Handler这个东西。

EventBus使用还是比较简单的,降低了代码耦合性,只需要在onEvent中处理数据即可。

Android 使用EventBus进行Fragment和Activity通信的更多相关文章

  1. 关于Fragment与Fragment、Activity通信的四种方式

    一直想总结一下Fragment与Fragment.Activity通信的问题,今天有时间一共总结了三种,权当抛砖引玉,如果大家还有更好的方式来实现Fragment和Fragment.Activity的 ...

  2. 【Android开发】之Fragment与Acitvity通信

    上一篇我们讲到与Fragment有关的常用函数,既然Fragment被称为是“小Activity”,现在我们来讲一下Fragment如何与Acitivity通信.如果上一篇还有不懂得,可以再看一下.传 ...

  3. Android学习——Fragment与Activity通信(二)

    接下来就要到Fragment向Activity传输数据了.主要的思路,就是在Fragment中创建一个回调接口,利用该回调接口实现Fragment向Activity传输数据的功能. 回调函数(接口) ...

  4. Android学习——Fragment与Activity通信(一)

    学会了在Activity中加载Fragment的方法之后,接下来便需要学习Activity和Fragment之间的通信.这一节先学习如何把Activity中的信息传递给Fragment. 基本过程 在 ...

  5. Fragment 与 Activity 通信

    先说说背景知识: (From:http://blog.csdn.net/t12x3456/article/details/8119607) 尽管fragment的实现是独立于activity的,可以被 ...

  6. Android进阶(十二)Fragment VS Activity

    Fragment  VS  Activity Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这 ...

  7. fragment 与activity通信 Bundle 序列化数据 Serializable

    1.fragment简单套用(静态调用): 新建一个fragment,其xml文件如下: <LinearLayout xmlns:android="http://schemas.and ...

  8. Android中Service与多个Activity通信

    由于项目需要,我们有时候需要在service中处理耗时操作,然后将结果发送给activity以更新状态.通常情况下,我们只需要在一个service与一个activity之间通信,通常这种情况下,我们使 ...

  9. Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系

    Fragment和Activity一样,可以重写onCreateOptionsMenu方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu的目的和效果都是完全一样的,但是由于 ...

随机推荐

  1. 解决javah生成.h头文件找不到找不到android.support.v7.app.AppCompatActivity的问题

    问题描写叙述: 在使用Android Studio进行JNI开发时,须要使用javah生成C或C++的头文件,可是可能会遇到: 错误: 无法訪问android.support.v7.app.AppCo ...

  2. Sql数据库查询语言

    1.概述 Sql是一种面向数据库的结构化查询语言.是符合美国国家标准化组织ANSI的一种计算机标准语言. Sql具对数据库的操作有:增删改查.创建数据库.创建表.创建存储过程.创建视图等 RDBMS关 ...

  3. 【MongoDB】The description of procedure in MongoDB

    In this blog the procedure of mongodb will be described in details. It is known that mongodb has pro ...

  4. 针对OpenSSL吐嘈的吐嘈-如此唱反调

    前些天写了一篇<令人作呕的OpenSSL>,顿时引来了大量的恶评.令我非常尴尬,同一时候也认为悲哀. 假设说you can you up之类的,我认为起码这人看出了我的本意,仅仅是怀疑我的 ...

  5. Hbase权限配置以及使用手册

    1.Hbase权限控制简介 Hbase的权限控制是通过AccessController Coprocessor协处理器框架实现的,可实现对用户的RWXCA的权限控制. 2.配置 配置hbase-sit ...

  6. 设计模式-(7)桥接(swift版)

    一,概念 桥接模式为把抽象层次结构从实现中分离出来,使其可以独立变更,抽象层定义了供客户端使用的上层抽象接口,实现层次结构定义了供抽象层次使用的底层接口,实现类的引用被封装于抽象层的实例中,桥接就形成 ...

  7. 搭建基于Maven的SSM框架

    先展示文件结构图对工程结构有大致了解: 主要为  ssm-parent (用来管理jar包版本)是每个工程的父工程,ssm-common(用来处理底层数据),ssm-manager(对数据库信息进行操 ...

  8. bzoj1934: [Shoi2007]Vote 善意的投票&&bzoj2768:[JLOI2010]冠军调查

    get到新姿势,最小割=最大流,来个大佬的PPT 这道题的做法是将st和1的xpy连,0的xpy和ed连,xpy之间jy连双向边,然后呢答案就是最小割. #include<cstdio> ...

  9. I.MX6 RGB clock 和 data 重合

    /*********************************************************************** * I.MX6 RGB clock 和 data 重合 ...

  10. 2. Ext中关于Ext.QuickTips.init()的使用

    转自:http://www.cnblogs.com/jianglan/archive/2011/08/26/2154120.html 在extJS的例子中,大部分都在程序第一行使用了如下语句:Ext. ...