標籤:
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 簡單資料參數耦合。兩個模組之間僅僅使用基礎資料型別 (Elementary Data Type)來傳遞資訊,這通常來說是可接受的。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/
Android應用模組之間通訊模式