手寫一個模塊化框架SimpleModuleRouter

簡介

SimpleModuleRouter,路由式框架,為多模塊開發(fā)提供了便利,方便主app與module之間,以及各module之間像http請求一樣(包含請求url,參數(shù),回調(diào))調(diào)用各自的功能,并且可以像rxjava一樣控制調(diào)用功能和回調(diào)功能執(zhí)行的線程。話不多說,直接上代碼

 //請求地址
            String url = "kb51://module1/fun1";

            // 拼接參數(shù)
            SmrParamsBody smrParamsBody = new SmrParamsBody()
                    .set("p1", "我是主殼傳來的數(shù)據(jù)")
                    .set("p2", "ssss");

            // 發(fā)起請求module1的功能,帶有線程切換
            SmrRequestClient.build().
                    requestOnThread(SchedulerType.MAIN_THREAD).
                    responseOnThread(SchedulerType.MAIN_THREAD).
                    call(this, url, smrParamsBody, new SmrResponseCallBack() {
                        @Override
                        public void response(Object data)  {
                            Log.v("smr1", "responsethread" + Thread.currentThread().getName());
                            tv1.setText("當前處于主殼頁面,module1返回的數(shù)據(jù)是:" + ((SmrParamsBody) data).get("m1"));
                        }
                    });

為什么要搞這框架呢?
隨著公司app參入的模塊越來越多,一個app分成了商場模塊,認證模塊等等,越來越不適合放到一個模塊里,并且,業(yè)務邏輯上的這些模塊,也需要互相調(diào)用,正好筆者以前也看過些butterKnife,Rxjava這些主流框架的源碼,就迫不及待想小試牛刀。

假如不適用模塊化框架,把業(yè)務上劃分的模塊獨立成例如module1和modul2,開發(fā)的時候,可能modul和module之間,module和主app module1之間少不了互相調(diào)用

使用前.png

使用后.png

工程目錄如下劃分的:


目錄一.png

使用步驟:

  1. 配置apt
    (1) .工程整體的build.gradle中配置如下
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

(2) .主殼的build.gradle中配置如下

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
.......
dependencies {
   ........
    compile project(':SimpleModuleRouter')
    compile project(':SimpleModuleRouter-annotations')
    apt project(':SimpleModuleRouter-compiler')
    compile project(':Module1')
    compile project(':Module2')
}

2.模塊也就是示例中的modul1和modul2中的build.gradle中導入SimpleModuleRoute

dependencies {
   ........
    apt project(':SimpleModuleRouter-compiler')
   }

3.注冊模塊功能
示例如下代碼:在Module1中,實現(xiàn)一個SmrModule的實現(xiàn)類,在register注冊這個模塊要提供的功能,和啟動url

public class SmrModuleApp implements SmrModule {


    @Override
    public void register(SmrApplication app) {

        app.register("kb51://module1/fun1", new SmrHandler() {
            @Override
            public void handle(SmrRequestContext smrRequestContext) throws Exception {

                //Log.v("smr1",smrRequestContext.getParams().get("p1").toString());

                //返回數(shù)據(jù)給調(diào)用方
                //smrRequestContext.responseCall(new SmrParamsBody().set("md1","模塊1發(fā)回的數(shù)據(jù)"));

                Navigation.navigateToMain(smrRequestContext);

            }
        });

    }

}

在主殼Application中注解添加全限定命

@SmrLoadModule(modules={"zm.myp.smr.m1.SmrModuleApp","zm.myp.smr.module2.SmrModuleApp"})
public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //啟動加載組件
        SmrApplication.loadModules(this);
    }
}

注冊好之后,這樣無論主殼app還是module2都可以調(diào)用這個功能,調(diào)用如下
4.調(diào)用

 //請求地址
            String url = "kb51://module1/fun1";

            // 拼接參數(shù)
            SmrParamsBody smrParamsBody = new SmrParamsBody()
                    .set("p1", "我是主殼傳來的數(shù)據(jù)")
                    .set("p2", "ssss");

            // 發(fā)起請求module1的功能,帶有線程切換
            SmrRequestClient.build().
                    requestOnThread(SchedulerType.MAIN_THREAD).
                    responseOnThread(SchedulerType.MAIN_THREAD).
                    call(this, url, smrParamsBody, new SmrResponseCallBack() {
                        @Override
                        public void response(Object data)  {
                            Log.v("smr1", "responsethread" + Thread.currentThread().getName());
                            tv1.setText("當前處于主殼頁面,module1返回的數(shù)據(jù)是:" + ((SmrParamsBody) data).get("m1"));
                        }
                    });

如果不用reqesutOnThread和responseOnThread,那么默認在主線程中

具體工程代碼請查看github鏈接:
https://github.com/zmMyp/SimpleModuleRouter

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容