本文介绍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. HDU 5056 Boring count(不超过k个字符的子串个数)

    Boring count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  2. BAPI 关闭和删除PR

    当PR在SAP里面已不再使用时,可使用批量使用以下两个BAPI进行处理: BAPI_REQUISITION_DELETE,进行删除处理, (速度快) BAPI_PR_CHANGE,进行关闭,但不删除( ...

  3. 迭代器-iteration

    class CoffrrIterator implements Iterator<Coffee> { int cunt = size; public boolean hasNext() { ...

  4. A - BBQ Easy

    Score : 200 points Problem Statement Snuke is having a barbeque party. At the party, he will make N  ...

  5. How to Execute Page_Load() in Page's Base Class?

    https://stackoverflow.com/questions/2737092/how-to-execute-page-load-in-pages-base-class We faced th ...

  6. CentOS 7下修改rabbitmq打开文件数量方法

    以下为使用systemd的修改方法:   1.系统层修改: 通过修改sysctl配置,提高系统的打开文件数量 vim /etc/sysctl.conf,添加: fs.file-max = 65535 ...

  7. Android沉浸式状态栏(透明状态栏)最佳实现

    Android沉浸式状态栏(透明状态栏)最佳实现 在Android4.4之前,我们的应用没法改变手机的状态栏颜色,当我们打开应用时,会出现上图中左侧的画面,在屏幕的顶部有一条黑色的状态栏,和应用的风格 ...

  8. Spring-AOP解析

    策略模式:选择动态代理还是CGLIB方式: 1.这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 2.AOP基本上是通过代理机制实现的 3.写好验证用户的代码,然 ...

  9. OAuth学习总结

    1.为什么需要OAuth? 新浪微博就是你的家.偶尔你会想让一些人(第三方应用)去你的家里帮你做一些事,或取点东西.你可以复制一把钥匙(用户名和密码)给他们,但这里有三个问题: 1)别人拿了钥匙后可以 ...

  10. 【转】Android 6.0 Marsmallow BLE : Connection Parameters

    原文网址:http://stackoverflow.com/questions/34617061/android-6-0-marsmallow-ble-connection-parameters Th ...