Android应用程序开发中通常需要多个模块进行通信(相互调用),如果不注意避免耦合,未来功能扩展以及调整会使得代码十分混乱,容易发生错误,并且维护困难。例如,Fragment直接通过(MainActivity)getActivity()的方式来使用其公共成员方法,Fragment和MainActivity之间紧耦合。
1 public class FragmentPage{ 2 ... 3 public void onClick(View v){ 4 ... 5 (MainActivity) getActivity().switchTab(MainActivity.RECOMMEND_TAB); 6 ... 7 } 8 } 9
首先来看常见的几种耦合类型:
1 简单数据参数耦合。两个模块之间仅仅使用基本数据类型来传递信息,这通常来说是可接受的。
2 简单对象耦合。指一个对象创建了另一个对象。在一般情况下这么做没有问题,但在某些情况下,如单元测试需要配置网络对象,这就需要依赖注入来解决问题。
3 语义耦合。指模块不是以接口的方式直接操作另一个模块。例如上面提到的例子,Fragment将一个Activity引用转换为其子类来使用。我们应尽量避免语义耦合。
那么如何避免紧耦合呢?
首先可以通过第一接口的方式,让其他类通过接口的方式与其通讯。
public class FragmentPage{ private TabSwitcher mTabSwitcher; ... public FragmentPage(TabSwitcher switcher){ mTabSwitcher = switcher; } public void onClick(View v){ ... mTabSwitcher (TabSwitcher.RECOMMEND_TAB); ... } }
在大型Android应用开发中,我们可能需要通知多个类某个事件的发生,如果单纯通过接口的方式实现,将会产生大量的接口,并且需要维护消息接受者队列,增加程序复杂度。因此我们需要能够管理订阅-发布关系的方案:MessageBus。这种沟通方式是基于订阅-发布设计模式,发布者可以发布消息,是的订阅了该消息的类或模块得到通知,使得两者完全的分离。
Android提供了广播的方式,使得Intent可以在不同的应用程序之间传递。但是在传递复杂的数据对象时,需要通过实现Serializable或Parcelable接口。当前更流行是使用基于事件的MessageBus,支持自定义事件。相关的EventBus有greenrobot EventBus和square otto。
参考资料:http://vinsol.com/blog/2014/11/04/communication-patterns-for-application-components/