大家好,我係蒼王。
以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。
[Android]如何做一個崩潰率少於千分之三噶應用app--章節列表
很多專案都是更新迭代中,才逐漸使用元件化的架構。
可以思考一下以下一些情景。
1.使用GreenDao等orm型別資料庫,如果你只是使用在登入功能當中,並沒涉及到其他資訊儲存,就因為需要獲得使用者物件,你是否一定要將整個物件型別下移到base module呢?
2.網路請求的時候,使用Retrofit等需要註解的框架,如果某個模組也用到這個請求,是否需要整個請求返回物件和請求封裝的interface也下移呢?
想清楚以上的問題,如何能在不更改原有程式碼的基礎上,能夠正常呼叫同一層級的其他業務module程式碼呢?這就是本章介紹的內容了。
這裡可以分為兩種情況,一種是隻涉及邏輯,不涉及介面。第二種是涉及到介面的。
首先介紹第一種做法
1.定義一個空的MBaseApi抽象類
public abstract class MBaseApi {}
複製程式碼
2.定義一個註冊類
public class ModuleApiManager {
static ModuleApiManager instance = new ModuleApiManager();
HashMap<Class<?extends MBaseApi>,MBaseApi> aMap;
public static ModuleApiManager getInstance(){
return instance;
}
private ModuleApiManager(){
aMap = new HashMap<>();
}
public boolean containsApi(Class<?extends MBaseApi> clazz){
return aMap.containsKey(clazz);
}
public <T extends MBaseApi> T getApi(Class<T> clazz){
return (T) aMap.get(clazz);
}
public void putApi(Class<?extends MBaseApi> key,MBaseApi value){
aMap.put(key, value);
}
public void removeApi(Class<?extends MBaseApi> key){
aMap.remove(key);
}
}
複製程式碼
3.建立模組的抽象Api class放到BaseModule當中
public abstract class PageNameApi extends MBaseApi{
public abstract String loadPageName();
}
複製程式碼
4.建立模組Ap實現類,這裡PageNameCore是邏輯類,可以是靜態或者是單例。
public class PageNameImpl extends PageNameApi{
@Override
public String loadPageName() {
return PageNameCore.getInstance().getName();
}
}
複製程式碼
5.在模組啟動的時候呼叫
ModuleApiManager.getInstance().putApi(PageNameApi.class,new PageNameImpl());
複製程式碼
倘若你定義的Impl實現類是個單例,填入單例也可以。
6.模組呼叫的時候
String pageName = ModuleApiManager.getInstance().getApi(PageNameApi.class).loadPageName();
複製程式碼
這樣做基本不會讓原有的邏輯更改。
如果想使用更新頁面邏輯,可以參考第7節的跨module互動的方式。
這裡通過介面的方式來,改造將BaseApi和抽象類Api改為介面,然後通過註冊實現呼叫。
業務模組中的頁面邏輯View、Activity、Fragment繼承介面Api,然後通過ModuleApiManager註冊,就可以使用了。
下一節將會更精彩,敬請期待!!!
冬天的清晨喚醒你的應該是夢想吧。
群號是316556016,也可以掃碼進群。我在這裡期待你們的加入!!!