組件化解耦竭业,SCM

SCM - 組件化通信工具

一切皆組件,當(dāng)每個(gè)組件可看成一個(gè)微服務(wù)及舍,組件化項(xiàng)目才會(huì)真正解耦

組件化介紹:

通過一個(gè)類比的例子來介紹組件化
隨著業(yè)務(wù)的復(fù)雜度增大未辆,業(yè)務(wù)線縱橫交錯(cuò),往往牽一發(fā)而動(dòng)全身锯玛。
我們希望業(yè)務(wù)代碼也能像一部智能手機(jī)咐柜。
入口模塊:應(yīng)用桌面圖標(biāo),更像是home模塊攘残,只提供入口拙友;
業(yè)務(wù)模塊:通過appstore,下載我們需要的app歼郭,每個(gè)app(模塊)職責(zé)分明遗契,鬧鐘,短信病曾,電話......牍蜂;
當(dāng)某個(gè)模塊需求變化,并不想影響到其他業(yè)務(wù)線的大規(guī)模變動(dòng),只用更新當(dāng)前app(模塊)泰涂;
甚至 -- 我的模塊鲫竞、組件可以發(fā)到 appstore 給其他手機(jī)使用(插件化),每個(gè)應(yīng)用可以資源互動(dòng)(組件通信)负敏,可以增量更新…
所以:
一切皆組件贡茅,
每個(gè)模塊就是一個(gè)微服務(wù),通過 rest api 來訪問其做,用完即走顶考。

SCM介紹:

SCM就是用來定義api接口(通過注解在編譯期生成服務(wù)注冊(cè)表),通過請(qǐng)求(SCM.req)妖泄,來拿到對(duì)應(yīng)服務(wù)(action)的響應(yīng)結(jié)果(ScCallback)的工具

SCM 不支持 Install Run

1: 通過注解注冊(cè) @Action(name = "") 聲明服務(wù) 類實(shí)現(xiàn)ScAction

2: 一個(gè) Action 對(duì)應(yīng)一個(gè)微服務(wù)

3: 通過對(duì)注解 Compiler 編譯期生成 -> 服務(wù)注冊(cè)表

4: Application 初始化 運(yùn)行期掃描服務(wù)驹沿、緩存注冊(cè)表

5: 調(diào)用 SCM.req(String action,Callback A) 調(diào)用服務(wù), 真正實(shí)現(xiàn)解耦

action ---> module actionTable ---> scmTable


SCM.png

使用:

1:根項(xiàng)目root-project的build.gradle

repositories {
        ...
        maven {
            url  "https://dl.bintray.com/woaigmz/SCM"
        }
    }

2:你的每個(gè)module的build.gradle

dependencies {
    compile 'com.woaigmz.scm:scm-api:0.0.5'
    compile 'com.woaigmz.scm:scm-annotation:0.0.5'
    annotationProcessor 'com.woaigmz.scm:scm-compiler:0.0.5'
    }

3:初始化

@Modules(names = {"Main", "Home"})
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        SCM.get().scanningSCMTable(App.class);
    }
}

4:定義 Service(@Action)為 module-home/actions/HomeLoadConfigAction,為 home-module 提供給外界的api

//home-module/actions/HomeLoadConfigAction 
@Action(name = "LoadConfig", module = "Home")
public class HomeLoadConfigAction implements ScAction {

    @Override
    public void invoke(Context context, String param, ScCallback callback) {
        //模擬加載網(wǎng)絡(luò)數(shù)據(jù)
        DataProvider.getConfig(callback);
    }

}
//home-module/actions/HomeEntryAction 
@Action(name = "HomeEntry", module = "Home")
public class HomeEntryAction implements ScAction {

    @Override
    public void invoke(Context context, String param, ScCallback callback) {
        Intent intent = new Intent();
        intent.setClass(context, HomeActivity.class);
        context.startActivity(intent);
        callback.onCallback(true, "HomeEntryAction:我把HomeActivity打開了", "");
    }
}

//除頁面跳轉(zhuǎn)之外蹈胡,大部分都是異步渊季,業(yè)務(wù)情景不同朋蔫,本框架不提供異步轉(zhuǎn)同步,開發(fā)者自己實(shí)現(xiàn)
5:請(qǐng)求:由action-name通過 SCM.req()方法在module-app / MainActivity 獲取 module-home/actions 下的服務(wù)action

private WeakHandler h = new WeakHandler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            String s = (String) msg.obj;
            Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            tvLoadConfig.setText(s);
            return false;
        }
    });
//通過Action :"LoadConfig"請(qǐng)求; 響應(yīng):ScCallback 返回的是子線程進(jìn)行的網(wǎng)絡(luò)請(qǐng)求結(jié)果要用handler
private void loadConfigByHomeModule() {
        try {
            SCM.get().req(MainActivity.this, "LoadConfig", new ScCallback() {
                @Override
                public void onCallback(boolean b, String data, String tag) {
                    if (b) {
                        Message obtain = Message.obtain();
                        obtain.obj = data;
                        if (h != null) {
                            h.sendMessage(obtain);
                        } else {
                            Toast.makeText(MainActivity.this, "WeakHandler has been Gc", Toast.LENGTH_SHORT).show();
                        }

                    }
                }
            });
        } catch (Exception e) {
            Log.e(Constants.SCM, e.getMessage());
        }
    }
//跳轉(zhuǎn)到  Home-module/view/HomeActivity
try {
                SCM.get().req(MainActivity.this, "HomeEntry", new ScCallback() {
                    @Override
                    public void onCallback(boolean b, final String data, String tag) {
                        if (b)
                            Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
                    }
                });
            } catch (Exception e) {
                Log.e(Constants.SCM, e.getMessage());
            }

想法:

想到 java 后臺(tái)通過action來定義一個(gè)接口 却汉,servlet里的 req驯妄,res,有更好的歡迎issue合砂,star fork 青扔。。翩伪。
具體實(shí)現(xiàn)思路可用參考項(xiàng)目:SCM地址:
注解工具的作用:action 加到注冊(cè)表微猖,通過 annotationProcessor 編譯時(shí)注解,編譯期生成(SCMTable)表注冊(cè)
注解工具鏈接:ActionProcessor.java
SCM優(yōu)點(diǎn):
1:跨進(jìn)程缘屹,通過傳遞的 json/string 字符實(shí)現(xiàn)類似 CC 的通過socket協(xié)議傳遞字符流
2:通過action對(duì)應(yīng)的name凛剥,反射調(diào)用Action的invoke方法,實(shí)現(xiàn)解耦合 類似組件化項(xiàng)目 ModularizationArchitecture (aidl + service跨進(jìn)程)
3:注冊(cè)表簡潔易懂轻姿,想到了R文件的生成犁珠,public static final "$actionName" = "@action對(duì)應(yīng)action的實(shí)際包名"
4:只要原來的協(xié)議不變(@action(name="XXX"))代碼重構(gòu)不會(huì)對(duì)action有影響
5:編譯期生成SCMTable提高了掃描整個(gè)包的性能
maven上傳命令:
gradle install / gradlew bintrayUpload 上傳項(xiàng)目到 maven
查看有焦點(diǎn)的activity的包名
linux:adb shell dumpsys activity | grep "mFocusedActivity" / windows:adb shell dumpsys activity | findstr "mFocusedActivity"
不提供異步轉(zhuǎn)通過方法,因?yàn)槌隧撁嫣D(zhuǎn)踢代,一般的action都是耗時(shí)操作盲憎,處理方式留給開發(fā)者具體問題具體對(duì)待嗅骄,

幾種異步轉(zhuǎn)同步:
wait / notify
條件鎖
Future
CountDownLatch/CyclicBarrier
Handler
信號(hào)量
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胳挎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溺森,更是在濱河造成了極大的恐慌慕爬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屏积,死亡現(xiàn)場離奇詭異医窿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)炊林,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門姥卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渣聚,你說我怎么就攤上這事独榴。” “怎么了奕枝?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵棺榔,是天一觀的道長。 經(jīng)常有香客問我隘道,道長症歇,這世上最難降的妖魔是什么郎笆? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮忘晤,結(jié)果婚禮上宛蚓,老公的妹妹穿的比我還像新娘。我一直安慰自己设塔,他們只是感情好苍息,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壹置,像睡著了一般竞思。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钞护,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天盖喷,我揣著相機(jī)與錄音,去河邊找鬼难咕。 笑死课梳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的余佃。 我是一名探鬼主播暮刃,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爆土!你這毒婦竟也來了椭懊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤步势,失蹤者是張志新(化名)和其女友劉穎氧猬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坏瘩,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盅抚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倔矾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妄均。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哪自,靈堂內(nèi)的尸體忽然破棺而出丰包,到底是詐尸還是另有隱情,我是刑警寧澤提陶,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布烫沙,位于F島的核電站,受9級(jí)特大地震影響隙笆,放射性物質(zhì)發(fā)生泄漏锌蓄。R本人自食惡果不足惜升筏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘸爽。 院中可真熱鬧您访,春花似錦、人聲如沸剪决。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柑潦。三九已至享言,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渗鬼,已是汗流浹背览露。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留譬胎,地道東北人差牛。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像堰乔,于是被迫代替她去往敵國和親偏化。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,317評(píng)論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,863評(píng)論 6 342
  • 前言镐侯,致家長朋友們 第一章 程序是什么侦讨? 第二章 arduino C和arduino開源硬件 第三章 本書硬件和編...
    bamboo_way閱讀 746評(píng)論 0 1
  • 筆芯·豐盛日記171022 1、今天析孽,我小小的心靈似乎再次被撐大了一些搭伤,同學(xué)們讓我體會(huì)到了什么叫作“自我限制”,什...
    01零壹閱讀 272評(píng)論 0 1
  • 你站在那里,一站就是一世贴谎,著一世的繁華落寂汞扎,就是永恒,你的語言擅这,已經(jīng)被人遺忘澈魄,被人記住的,只有你的另一個(gè)名字——死...
    殷商子受閱讀 280評(píng)論 2 3