实例讲解EventBus for Android
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了实例讲解EventBus for Android,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2840字,纯文字阅读大概需要5分钟。
内容图文
简介
EventBus是一个很棒的事件订阅与发布的框架,项目地址:https://github.com/greenrobot/EventBus。
作用
Android各个组件间的以接口的方式进行的通信问题:
1 增加了组件间的耦合,某个组件的修改可能会引起另一个组件的修改,因此灵活度不高。
2 充斥着大量样板话的代码:
定义接口和回调
管理监听器
在各个层之间传递调用链
Android中,常见组件间的交互关系如下图所示:
下面以list/details场景来说明组件间的通信问题。我们开发的app中有时会有这样一个需求:点击ListFragment中的某一项,DetailFragment展示对应的数据,组件间的关系如下图所示:
实现上述需求对应的代码如下:
DetailFragment中定义函数:
//函数定义好了,如何被调用?
public
void
loadDetails(Item items) {
...
}
ListFragment中定义接口:
interface Contract {
void onItemSelected(Item item);
}
//传递到Activity中
((Contract)getActivity)).onItemSelected(item);
Activity实现接口:
public
class
MyActivity
implements
ListFragment.Contract {
public
void
onItemSelected(Item item) {
DetailFragment detailFragment = (DetailFragment)getFragmentManager().
findFragmentBy...;
detailFrasgment.loadDetails(item);
}
}
EventBus使组件间的通信变的更加简单,组件间通信如下图所示:
EventBus由4个基本成分组成:发布者,订阅者,事件和总线。4者的关系如下图所示:
基本用法
1 定义Event
public class MyEvent {}
2 订阅者注册
EventBus.getDefault().register(this);
3 发布事件
EventBus.getDefault().post(event);
4 接收事件
public void onEvent(MyEvent event);
EventBus的事件处理方法:onEvent
1 在注册订阅者时,EventBus扫描订阅者中的事件处理函数
2 命名约定:以onEvent开头,public, 无返回值,只有一个参数
当某个事件被发布,EventBus是通过参数类型来确定哪个订阅者响应事件的.
使用EventBus实现list/details场景
Step 1: 定义Event Class
public
class
ItemSelectedEvent {
public
final Item item;
publicItemSelectedEvent(Item item) {
this.item = item;
}
}
Step 2: ListFragment中发送事件
EventBus.getDefault().post(new ItemSelectedEvent(item));
Step 3: DetailFragment中处理事件
public
void
onEvent(ItemSelectedEvent event) {
...
}
[点击下载源码](http://download.csdn.net/detail/lmj623565791/8126089)
EventBus的线程模型
为何要定义事件模型?因为在Android的中线程的使用有以下的限制:
1 主线程不能被阻塞,UI的更新位于主线程,耗时操作如网络处理在后台线程
2 事件的发送和处理可能会位于不同线程
通过使用EvenBus的线程模型,我们可以定义处理事件的线程类型。EventBus中有四种线程模型:PostThread,MainThread,BackgroundThread,Async,下面分别介绍之。
PostThread
默认的线程模型,事件发布和接收在相同的线程,适合用于完成时间非常短的任务,以免阻塞UI。例:
// Called in the same thread (default)
public
void
onEvent(MessageEvent event) {
log(event.message);
}
MainThread
订阅者的事件处理方法在主线程被调用,适合处理开销小的事件,以免阻塞主线程。例:
// Called in Android UI‘s main thread
public
void
onEventMainThread(MessageEvent event) {
textField.setText(event.message);
}
BackgroundThread
订阅者的事件处理在后台被调用。若事件发送线程位于主线程,EventBus将使用一个后台线程来逐个发送事件。
// Called in the background thread
public
void
onEventBackgroundThread(MessageEvent event){
saveToDisk(event.message);
}
Async
事件处理位于一个单独的线程,该线程往往既不是发送事件的线程,也不是主线程。使用这个模型适用于事件发送无需等待事件处理后才返回,适合处理耗时操作,如请求网络。EventBus内部使用线程池来管理多个线程。例:
// Called in a separate thread
public
void
onEventAsync(MessageEvent event){
backend.send(event.message);
}
小结:
本文介绍了EventBus的功能和用法,在接下来一篇文章中,我将介绍EventBus的实现原理和内部数据结构。
原文:http://blog.csdn.net/bigconvience/article/details/46278719
内容总结
以上是互联网集市为您收集整理的实例讲解EventBus for Android全部内容,希望文章能够帮你解决实例讲解EventBus for Android所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。