Otto学习以及使用,简单方便处理组件耦合
2014-12-29 12:11
369 查看
当一个Android应用功能越来越多的时候,保证应用的各个部分之间高效的通信将变得越来越困难。
在应用中的多个地方,控件经常需要根据某个状态来更新他们显示的内容。这种场景常见的解决方式就是定义一个接口,需要关注该事件的控件来实现这个接口。然后事件触发的地方来注册/取消注册这些对该事件感兴趣的控件。
每个控件实现这个接口,导致这些控件和位置管理器注册强耦合在一起。这还意味着,当单元测试的时候,您需要模拟(mocked)位置管理器来生成位置更新事件。
随着应用功能的增加,需要监听的事件越来越多,而越来越多的控件需要监听不同的事件,则导致越来越多的控件需要注册到各种事件管理器上。注册和取消注册这些事件慢慢的会变得越来越难以管理。导致测试越来越困难,并将导致开发者的效率越来越低,同时在您的应用中越来越容易引入各种奇怪的Bug。
那么这个时候就用到了Android系统的一个Event Bus模式类库(Otto)。用来简化应用组件间的通信。
Otto 官网: http://square.github.io/otto/
githu地址:https://github.com/square/otto
//一下代码事例已经写的很全面的大家就看吧
一、Android Studio中配置Otto (Eclipse中直接下载jar包导入)
跟之前介绍的其他的框架一样,它只需要简单地在build.gradle中配置下面一行红色字体即可
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:19.+'
/ /otto 所需要依赖的包
compile 'com.squareup:otto:+'
}
二、Otto事件总线框架浅析
1、为什么要用Otto框架?
Otto框架的主要功能是帮助我们来降低多个类之间的耦合度的(解耦)。
譬如:一个类A和另一个类B之间,如果A要操作B中的某个方法。
传统的方法:A直接调用B对象的该方法(耦合在一起)
事件总线机制:A不需要调用B类的方法,而仅仅需要产生并发出 一个“事件通知”, 如果B订阅了该“事件”
那么它将会接受到这个事件,做出相应的操作。这样就被解耦了。
2. Otto框架使用(结合代码介绍)
Otto框架其实相对之前的几个Android开源框架来说,更容易理解。
它主要运用到一个类: Bus类(用于注册类,注销类,发布事件)
两个注解: @Subscribe (订阅) @Produce (生产) 【都是针对“事件”的注解】
为了方便,我这边没有使用两个类来做这个Demo, 不过如果大家要试的话也可以,不过记住一点,无论是
发布者类 还是 订阅者类, 都需要用Bus进行类的注册,还有注销。否则将没法被Bus识别,这样就无法生效了。
下面的Demo, 仅为了让大家知道“事件”被产生了之后,post出来,所有订阅了该事件的类都会接到该事件,接受的先后顺序,不由我们控制!
//第一次发博客 将自己学习 讲前辈们东西总结了一下。
在应用中的多个地方,控件经常需要根据某个状态来更新他们显示的内容。这种场景常见的解决方式就是定义一个接口,需要关注该事件的控件来实现这个接口。然后事件触发的地方来注册/取消注册这些对该事件感兴趣的控件。
每个控件实现这个接口,导致这些控件和位置管理器注册强耦合在一起。这还意味着,当单元测试的时候,您需要模拟(mocked)位置管理器来生成位置更新事件。
随着应用功能的增加,需要监听的事件越来越多,而越来越多的控件需要监听不同的事件,则导致越来越多的控件需要注册到各种事件管理器上。注册和取消注册这些事件慢慢的会变得越来越难以管理。导致测试越来越困难,并将导致开发者的效率越来越低,同时在您的应用中越来越容易引入各种奇怪的Bug。
那么这个时候就用到了Android系统的一个Event Bus模式类库(Otto)。用来简化应用组件间的通信。
Otto 官网: http://square.github.io/otto/
githu地址:https://github.com/square/otto
//一下代码事例已经写的很全面的大家就看吧
一、Android Studio中配置Otto (Eclipse中直接下载jar包导入)
跟之前介绍的其他的框架一样,它只需要简单地在build.gradle中配置下面一行红色字体即可
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:19.+'
/ /otto 所需要依赖的包
compile 'com.squareup:otto:+'
}
二、Otto事件总线框架浅析
1、为什么要用Otto框架?
Otto框架的主要功能是帮助我们来降低多个类之间的耦合度的(解耦)。
譬如:一个类A和另一个类B之间,如果A要操作B中的某个方法。
传统的方法:A直接调用B对象的该方法(耦合在一起)
事件总线机制:A不需要调用B类的方法,而仅仅需要产生并发出 一个“事件通知”, 如果B订阅了该“事件”
那么它将会接受到这个事件,做出相应的操作。这样就被解耦了。
2. Otto框架使用(结合代码介绍)
Otto框架其实相对之前的几个Android开源框架来说,更容易理解。
它主要运用到一个类: Bus类(用于注册类,注销类,发布事件)
两个注解: @Subscribe (订阅) @Produce (生产) 【都是针对“事件”的注解】
为了方便,我这边没有使用两个类来做这个Demo, 不过如果大家要试的话也可以,不过记住一点,无论是
发布者类 还是 订阅者类, 都需要用Bus进行类的注册,还有注销。否则将没法被Bus识别,这样就无法生效了。
下面的Demo, 仅为了让大家知道“事件”被产生了之后,post出来,所有订阅了该事件的类都会接到该事件,接受的先后顺序,不由我们控制!
public class MyActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); findViewById(R.id.button_change).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { BusProvider.getBusInstance().post(new DataChangedEvent("this is changed String"));//发布事件 } }); } @Override protected void onResume() { super.onResume(); BusProvider.getBusInstance().register(this);//注册 } @Override protected void onPause() { super.onPause(); BusProvider.getBusInstance().unregister(this);//注销 } @Subscribe //订阅事件DataChangedEvent public void sayGoodOnEvent(DataChangedEvent event){ Log.e("event", "good"); } @Subscribe //订阅事件 public void sayBadOnEvent(DataChangedEvent event){ Log.e("event", "bad"); } @Produce //产生事件 public DataChangedEvent produceDataChangedEvent(){ return new DataChangedEvent("this is changed String"); } }
//第一次发博客 将自己学习 讲前辈们东西总结了一下。
相关文章推荐
- MongoDB的使用学习之(五)Spring集成MongoDB以及简单的CRUD
- Android学习一——动态添加组件与删除,可见性设置,imagebutton简单使用
- 学习淘淘商城第十九课(搭建单机版FastDFS图片服务器以及使用FastDFS-Client客户端进行简单测试)
- quick组件模块的使用以及简单案例
- Vue------第五天(Vue的Ajax请求,使用Axios,目前熟悉了一下,主要包括GET请求、POST请求、并发请求、请求参数的配置、服务器响应的结构以及对服务器响应错误的简单处理)
- OpenCV学习笔记(8)VS2008 MFC下使用OpenCV2.0进行简单图像处理
- 【Python3.6爬虫学习记录】(五)Cookie的使用以及简单的爬取知乎
- salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)
- OpenGL4.x学习之使用着色器、绑定VAO以及绘制最简单的图元——点
- scala学习之路:1简单的打印输出,以及for循环的使用
- 一只简单的网络爬虫(基于linux C/C++)————Url处理以及使用libevent进行DNS解析
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- Android 四大组件之(3)BroadcastReceiver广播事件处理以及与Notification的配合使用详解
- JPopupMenu的使用以及JPopupMenu中子组件的事件处理
- 王亟亟的Python学习之路(九)-sorted()排序以及简单字符串处理
- 王亟亟的Python学习之路(九)-sorted()排序以及简单字符串处理
- 学习笔记:zipfile的简单使用解压和压缩文件,以为处理加密的情况
- 个人学习代码保存:例8.在存储过程中使用简单的事务处理
- webuploader组件的使用以及文件上传下载后台处理
- Mybatis学习笔记一:环境搭建以及简单使用