簡介
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)用


工程目錄如下劃分的:

使用步驟:
- 配置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