国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android module解耦組件化總體概述(推薦)

2019-10-21 21:46:44
字體:
來源:轉載
供稿:網友

原由

移動開發中,隨著項目不斷的跌代,需求越來越復雜后。項目工程也越來越龐大。那么此時的分module的開發,則是必然的選擇了。在最終的組件化之路上,不妨把單一工程比如石器時代,那么接下來簡單的拆分工程分多個moudle開來就是銅器時代。

銅器時代之簡單分module

演進

由于從復雜的單工程拆分了多個module了,達到了代碼及資源的初步的隔離,或需求模塊的開發人員,開始專注于自己的需求模塊module的開發了。但是隨著部分需求有相關性,需要相互調用時。那么問題來了,在AXXX module中

api project(':BXXX')

而在BXXX module中

api project(':AXXX')

這時出現了相互依賴,首先編譯器會能不過,會出現Circular dependency,循環相互依賴的問題,這是絕不允許的。

為了解決上述的問題,將AXXX module與BXXX module需要對外提供服務能力支持的,進行封裝與抽象。將需要對外暴露接口/協議地方,對其抽象出接口出來。把些這接口獨立放在BaseXXXX module中,這樣AXXX module與BXXX module,都分別去

api project(':BaseXXXX')

通過BaseXXXX中間module通信去解決AXXX module與BXXX module相互依賴調用通信。

初步的解決方法

為了在BaseXXXX module中,搭建起AXXX module與BXXX module相互通信的橋梁,可以在BaseXXXX module 定義一個通信標識接口:

/** * * 跨module通訊的 標識 interface接口 */public interface IModuleApi {}

然后主要通過ModuleApiHelper進行通信

public class ModuleApiHelper {  private static Map<Class<? extends IModuleApi>,IModuleApi> moduleApiMap = new HashMap<>();  private static Map<Class<? extends IModuleApi>,List<IModuleApi>> moduleApiListMap = new HashMap<>();  /**   * 跨module 注冊進 IKWModuleApi接口,及實現   * 通常可以在 其它的module中 注冊此接口的實現,在用的module中getModuleApi拿到接口實現   * 這樣,用的module 不是 必須依賴compile其它module了   * @param clazz   * @param iModuleApi   */  public static void register(Class<? extends IModuleApi> clazz, IModuleApi iModuleApi){    if (null != iModuleApi && null != clazz){      moduleApiMap.put(clazz, iModuleApi);    }  }  public static void unregister(Class<? extends IModuleApi> clazz){    if (moduleApiMap.containsKey(clazz)){      moduleApiMap.remove(clazz);    }  }  public static void register2List(Class<? extends IModuleApi> clazz, IModuleApi iModuleApi){    if (null != iModuleApi && null != clazz){      if (moduleApiListMap.containsKey(clazz)){        List<IModuleApi> iModuleApis = moduleApiListMap.get(clazz);        iModuleApis.add(iModuleApi);      }else{        List<IModuleApi> iModuleApis = new ArrayList<>();        iModuleApis.add(iModuleApi);        moduleApiListMap.put(clazz, iModuleApis);      }    }  }  public static void unregister2List(Class<? extends IModuleApi> clazz){    if (moduleApiListMap.containsKey(clazz)){      moduleApiListMap.remove(clazz);    }  }  public static void unregisterAll(Class<? extends IModuleApi> clazz){    unregister(clazz);    unregister2List(clazz);  }  public static <T extends IModuleApi> List<T> getModuleListApi(Class<T> clazz){    if (null != clazz){      if (moduleApiListMap.containsKey(clazz)){        List<IModuleApi> iModuleApis = moduleApiListMap.get(clazz);        return (List<T>) iModuleApis;      }else{        return null;      }    }else{      return null;    }  }  /**   * 獲取注冊綁定過來的IKWModuleApi 實現   * @param clazz   * @param <T>   * @return   */  public static <T extends IModuleApi> T getModuleApi(Class<T> clazz){    if (null != clazz){      if (moduleApiMap.containsKey(clazz)){        return (T) moduleApiMap.get(clazz);      }else{        return null;      }    }else{      return null;    }  }}

這樣比如在AXXX module中將原有AServiceData類是如下的:

public class AServiceData {  public String getSomeData(){    return "this is some data";  }  public void sayHello(){    System.out.println("hello");  }}

改造成

public interface IAServiceData extends IModuleApi {  String getSomeData();  void sayHello();}public class AServiceData implements IAServiceData{  @Override  public String getSomeData(){    return "this is some data";  }  @Override  public void sayHello(){    System.out.println("hello");  }}

將IAServiceData接口定義在BaseXXXX module 中。然后AXXX module中進行register相應的服務

public class AModuleService {  public void init(){    ModuleApiHelper.register(IAServiceData.class,new AServiceData());  }}

這樣調用AModuleService的init方法,即可對IAServiceData服務進行注冊了。然后即下來,在BXXX module中進行getXXX得到服務即可調用相應的方法了.

在任何需要此服務的方法可如下調用:

IAServiceData iaServiceData = ModuleApiHelper.getModuleApi(IAServiceData.class);

注意

1> register注冊時機,需要越早越好,一般建議在各module的有類似的application的onCreate時注冊最好。

2> IModuleApi與ModuleApiHelper,和各extends繼承IModuleApi接口的接口,需要放在中間通信BaseXXX Module中。各需要通信的module去 compile/api BaseXXX Module即可。

問題

為了保證IModuleApi接口注冊有效,需要越早越好進行注冊。這樣隨著項目越來越復雜,需要通信的地方越來越多。統一的ModuleApiHelper,注冊的地方將越來越多帶的問題也多起來。

1> 注冊Map容器占用的內存不斷的增多。
2> register注冊的地方不統一,有些放在各module的類Application的onCreate中,有些可能是放在其它的類中.
3> 不支持ui頁面的跳轉,由AXXX module的AxxActtivy頁面跳轉到BXXX module的BxxActivity頁面中。
4> 不支持多進程中應用。

為了解決上述問題,引入了蒸汽時代之ARoute到來。

蒸汽時代之ARoute

由于遍幅的原因,總體概述不詳細細述ARoute,下遍再剖析ARoute。總體來說在多module通信中解決了:

1> 解決了ui頁面的跳轉問題。
2> 根據需要進行register的問題,且register通過靜態注解來的,所以register地方統一比如容易維護。

但是依然不能解決多進程中的應用。

電器時代之Andromeda

Andromeda解決了多進程,跨進程ipc之間的通信過程,同樣也支持單進程的通信...

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 隆德县| 金门县| 崇明县| 沁源县| 弥勒县| 沾益县| 张家界市| 桃园市| 新津县| 长治市| 西吉县| 黄梅县| 湘潭市| 名山县| 连平县| 太保市| 仙桃市| 土默特右旗| 松阳县| 泰宁县| 渝北区| 渑池县| 宁南县| 泸定县| 南京市| 周口市| 定安县| 黄冈市| 中牟县| 隆昌县| 宁安市| 且末县| 六盘水市| 沾化县| 泸水县| 扬中市| 曲麻莱县| 三都| 玉环县| 台山市| 宜良县|