Android应用模块之间通信模式

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 EventBussquare otto
 
参考资料:http://vinsol.com/blog/2014/11/04/communication-patterns-for-application-components/

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。