您的位置:首页 > 其它

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出来,所有订阅了该事件的类都会接到该事件,接受的先后顺序,不由我们控制!

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");
}

}


//第一次发博客 将自己学习 讲前辈们东西总结了一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐