首次开启博客编写之旅,文章仅供个人总结,欢迎进行技术交流。之所以写这篇博客是因为在项目使用中引用fragment与activity之间进行深层次交互,先是使用的接口回调(业务逻辑处理过于繁琐)、其次是用了广播,但后期发现使用广播在多个(三个以上)fragment接收数据时,一些fragment在onReceive中会接收两次(此问题暂未解决,有解决者请指导一下,不胜感激)。好了,下面进入正题:
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。在本文中我使用的是EventBus的线程模式:主线程模式(参考第四步)
ThreadMode.MAIN
1、下载EventBus的类库
源码: https://github.com/greenrobot/EventBus
2、我使用的是AS,故此需要在build.gradle中引入EventBus包,如下:
dependencies {compile 'org.greenrobot:eventbus:3.0.0'}
3、自定义一个类,如下:
/** * Eventbus消息 */ public class MessageEvent { public String eventType; public Object eventData; public MessageEvent() { } public MessageEvent(String eventType, Object eventData) { this.eventType = eventType; this.eventData = eventData; } }4、在接收消息的界面注册,如下是在fragment中注册
/** * 2016/11/2 上午11:33:33 * * @param savedInstanceState */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EventBus.getDefault().register(this); }5、在该fragment中定义接收方法,如下:(注意,一定要加入注解)
@Subscribe(threadMode = ThreadMode.MAIN)
@Subscribe(threadMode = ThreadMode.MAIN) public void handleMessageEvent(MessageEvent messageEvent) { if (android.text.TextUtils.equals(messageEvent.eventType, "QACTION_NAME")) { //messageEvent为发送过来的消息,自己进行消息处理,QACTION_NAME为定义的action,6、在该fragment中要注意解除注册,如下://需与发送一方保持一致boolean refreshFlag = (boolean) messageEvent.eventData;}}
@Override public void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }7、发送消息,我是在activity中进行的(activity与fragment通信),如下:
自己定义一个监听事件
好了,整个过程就结束了,步驟很詳細,以後再使用的時候就可以拿來直接引用了String action="QACTION_NAME";//与接收方保持一致 EventBus.getDefault().post(new MessageEvent(action, "这里填写传入的参数,类型自定义"));