欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年07月17日 10:13:20   作者:snsports  
這篇文章主要介紹了android module解耦組件化總體概述(推薦),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

原由

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

銅器時代之簡單分module

演進

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

api project(':BXXX')

而在BXXX module中

api project(':AXXX')

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

為了解決上述的問題,將AXXX module與BXXX module需要對外提供服務能力支持的,進行封裝與抽象。將需要對外暴露接口/協(xié)議地方,對其抽象出接口出來。把些這接口獨立放在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接口,及實現(xiàn)
   * 通??梢栽?其它的module中 注冊此接口的實現(xiàn),在用的module中getModuleApi拿到接口實現(xiàn)
   * 這樣,用的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 實現(xiàn)
   * @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接口注冊有效,需要越早越好進行注冊。這樣隨著項目越來越復雜,需要通信的地方越來越多。統(tǒng)一的ModuleApiHelper,注冊的地方將越來越多帶的問題也多起來。

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

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

蒸汽時代之ARoute

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

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

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

電器時代之Andromeda

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

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

相關文章

  • Android ListView優(yōu)化之提高android應用效率

    Android ListView優(yōu)化之提高android應用效率

    android listview優(yōu)化做的好是提高androoid應用效率的前提條件,本文給大家介紹Android ListView優(yōu)化之提高android應用效率,對android listview優(yōu)化相關知識感興趣的朋友一起學習吧
    2015-12-12
  • Android自定義Toast之WindowManager

    Android自定義Toast之WindowManager

    這篇文章主要為大家詳細介紹了Android自定義Toast之WindowManager的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • android創(chuàng)建手勢識別示例代碼

    android創(chuàng)建手勢識別示例代碼

    使用一些瀏覽器或者輸入法應用時會有一些手勢操作,還可以自定義手勢。這些神奇的操作是怎么做的呢?這一篇重點記錄手勢的識別和創(chuàng)建
    2014-01-01
  • Android 布局文件Layout XML屬性

    Android 布局文件Layout XML屬性

    本文主要介紹Android Layout XML 一些屬性,在Android開發(fā)過程中布局文件大家肯定都會用到,在這里對Layout XML 進行詳解,希望能對大家有所幫助
    2016-07-07
  • Ubuntu 14.04下創(chuàng)建Genymotion安卓虛擬機的步驟詳解

    Ubuntu 14.04下創(chuàng)建Genymotion安卓虛擬機的步驟詳解

    Android 模擬器一直以速度奇慢無比著稱,基本慢到不可用。本文介紹我一直在用的 Genymotion,速度不亞于真機。而且功能齊全,使用簡單。下面這篇文章主要介紹了Ubuntu 14.04下創(chuàng)建Genymotion虛擬機的步驟,需要的朋友可以參考下。
    2017-03-03
  • Android之禁止ViewPager滑動實現(xiàn)實例

    Android之禁止ViewPager滑動實現(xiàn)實例

    這篇文章主要介紹了Android之禁止ViewPager滑動實現(xiàn)實例的相關資料,需要的朋友可以參考下
    2017-05-05
  • Android實現(xiàn)關機與重啟的幾種方式(推薦)

    Android實現(xiàn)關機與重啟的幾種方式(推薦)

    這篇文章主要介紹了Android實現(xiàn)關機與重啟的幾種方式(推薦)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Android Studio使用ButterKnife和Zelezny的方法

    Android Studio使用ButterKnife和Zelezny的方法

    這篇文章主要為大家詳細介紹了Android Studio使用ButterKnife和Zelezny的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Android SeekBar實現(xiàn)禁止滑動

    Android SeekBar實現(xiàn)禁止滑動

    這篇文章主要為大家詳細介紹了Android SeekBar實現(xiàn)禁止滑動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Android實現(xiàn)退出時關閉所有Activity的方法

    Android實現(xiàn)退出時關閉所有Activity的方法

    這篇文章主要介紹了Android實現(xiàn)退出時關閉所有Activity的方法,主要通過自定義類CloseActivityClass實現(xiàn)這一功能,需要的朋友可以參考下
    2014-09-09

最新評論