1. 程式人生 > >Android模組化專案模組間資料互動解決方案

Android模組化專案模組間資料互動解決方案

    之前呢,也做過一個關於模組化業務分離的架構方案,這篇帖子想分享一下關於模組間的資料互動的方案。模組化架構,基礎的可以通過建立多個module來把業務進行區分和程式碼的解耦。為了解耦,讓module可拆卸,可移植,那麼業務模組間是不會有任何的依賴和引用的,在這樣的情況下,我們如何才能讓模組間聯絡起來,進行資料互動呢。

    下面來對我專案的思路做個概述。

1.涉及框架

        路由框架, 用路由框架,通過url的形式查詢具體的service實現類,從而執行相關操作。目的就是為了做到在沒有任何模組間依賴和引用的情況下實現向上轉型。(我使用的是阿里的Arouter)

2.實現思路

        第一,我們的模組化專案一定在縱向上有分層,比如從下到上有base模組,業務模組,和app入口模組。所有業務模組都有base模組的依賴,但業務模組之間沒有任何引用和依賴。


        第二,從base模組入手,建立base service介面,base service實現基類。介面中要可提供callback,以供給呼叫者設定回撥介面。實現基類需要拿到呼叫者設定的回撥介面,以在完成邏輯操作後將資料進行回傳。

        第三,在base模組中,建立service介面並繼承base service介面,編寫提供給呼叫者使用的方法,引數由負責不同業務的同事進行商討決定。

        第四,在對應業務模組中,建立service實現類並繼承base service實現基類,並且implements對應的service介面,去實現方法的具體邏輯。

        完成以上四步,編碼工作就基本結束,就可以提供給開發者進行業務程式碼編寫了。下面呢,我就通過程式碼的形式,將這四步操作再來描述一遍,並且舉個例子。

3.程式碼走起

        首先,第一步就沒有什麼程式碼可展示了,只要你的專案架構有縱向分層就可以了。


        第二步,來建立我們的service介面基類,service實現基類。

        先建立一個ServiceCallBack介面作為資料回撥的載體監聽,並加上泛型。

public interface ServiceCallBack<T> {
    void callBack(T t);
}

        建立BaseIService繼承IProvider。IProvider是ARouter框架中的一個基類介面,對我們這個互動思路沒有太大參與,大家都這麼用,那麼我也這麼用。然後BaseIService中,建立getDataBack方法,以用於呼叫者去設定回撥監聽。建立setDataBack用於被呼叫者去將資料進行回傳。

public interface BaseIService<T> extends IProvider{

    void getDataBack(ServiceCallBack serviceCallBack);

    void setDataBack(T t);
}

        建立BaseService並實現BaseIService。編寫成員變數ServiceCallBack,並在getDataBack中將呼叫者傳過來的callback賦值過來,以用於邏輯執行結束之後,通過callback將資料進行回傳。然後去實現setDataBack,利用成員變數callback的例項進行資料回傳。
public class BaseService<T> implements BaseIService<T> {

    protected ServiceCallBack serviceCallBack;

    @Override
    public void getDataBack(ServiceCallBack serviceCallBack) {
        this.serviceCallBack = serviceCallBack;
    }

    @Override
    public void init(Context context) {

    }
    @Override
    public void setDataBack(T t) {
        if (null != serviceCallBack) {
            serviceCallBack.callBack(t);
        }
    }

}

        基類編寫完成之後,下面寫一個test介面,和test邏輯實現類來展示一下如何使用。

        在base模組中,建立ITestService介面並繼承BaseIService。並建立doSomething方法提供給呼叫者進行呼叫。

public interface ITestService extends BaseIService{

    void doSomeThing(String string);
}

        加入現在有業務A模組,業務B模組,呼叫者是業務A模組的同事,想要呼叫業務B的一些業務。那麼在業務B模組中需要建立實現類。建立TestService類,繼承BaseService,並實現ITestService介面。並使用@Route註解對類進行修飾,後期將通過url的形式去把實現類做向上轉型操作。

@Route(path = "/test/service")
public class TestService extends BaseService implements ITestService {

    @Override
    public void doSomeThing(String string) {

    }
    
}

        實現類建立好後,就可以在對應的方法中去編輯具體的業務邏輯,比如開啟一個選擇頁面等等。下面來編輯一下,我們先來個簡單的例子。當呼叫了doSomeThing之後,也回傳一條字串。

@Route(path = "/test/service")
public class TestService extends BaseService implements ITestService {

    @Override
    public void doSomeThing(String string) {
        getDataBack(stirng + "000");
    }
}

        實現類編輯好之後,就需要看一下如何呼叫其他模組的邏輯。在業務A模組中,需要呼叫的位置,先要通過url去找到對應實現類並做向上轉型。為什麼要做向上轉型,是因為業務A模組與業務B模組之間並沒有依賴和引用,所以業務A模組中並不會得到TestService的引用,只能向上轉型為base模組中的TestIService。(看infor_screen_button的點選邏輯)

@OnClick({R.id.infor_screen_button, R.id.infor_call_button, R.id.infor_add_button})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.infor_screen_button:
                ITestService service = (ITestService) ARouter.getInstance().build("/test/service").navigation();
                service.getDataBack(new ServiceCallBack<String>() {
                    @Override
                    public void callBack(String s) {
                        Toast.makeText(mContext,s,Toast.LENGTH_SHORT).show();
                    }
                });
                service.doSomeThing("test1");
                break;
            case R.id.infor_call_button:
                break;
            case R.id.infor_add_button:
                openDialog();
                break;
        }
    }

        首先,根據url找到實現類並做向上轉型。

ITestService service = (ITestService) ARouter.getInstance().build("/test/service").navigation();

        然後,呼叫getDataBack來設定回撥監聽,記得最好加上泛型。其中泛型是由業務A模組和業務B模組兩方開發人員商討決定的。並且在callBack方法中編寫資料回傳後的業務處理邏輯。

service.getDataBack(new ServiceCallBack<String>() {
                    @Override
                    public void callBack(String s) {
                        Toast.makeText(mContext,s,Toast.LENGTH_SHORT).show();
                    }
                });

        最後呼叫介面的doSomeThing方法。

service.doSomeThing("test1");

        最終效果就是當點選按鈕的時候,就會彈出一個test1000內容的吐司。那麼一個簡單的資料互動就實現了。但是,此時就問了,如果我呼叫其他業務的邏輯並非馬上就能回傳資料,而是在一些操作後才有資料回傳呢?那麼下面就再舉個例子,來展示一下這種情況下程式碼如何編寫。

        重新編輯一下業務B模組中的TestService實現類中的doSomeThing方法。

        這次就不是直接進行資料回傳了,而是打開了業務B模組中的一個頁面,在頁面中做了一些操作之後才進行資料回傳。

@Route(path = "/test/service")
public class TestService extends BaseService implements ITestService {

    @Override
    public void doSomeThing(String string) {
        ARouter.getInstance().build("/testa/testa").withString("testStr",string).navigation();
    }

}

        那麼來看下在頁面中在操作之後如何把資料回傳回去。當點選了between_modules_button的按鈕之後,表示執行了一個業務邏輯,然後通過url把實現類找到並作向上轉型,通過service的setDataBack方法就可以將資料進行回傳了。

 } else if (i == R.id.between_modules_button) {//模組間功能呼叫
            ITestService service = (ITestService) ARouter.getInstance().build("/test/service").navigation();
            service.setDataBack(testStr + "000");
            finish();

 } else if (i == R.id.arouter_fin
        那麼,這樣一來,就可以在不同模組之間進行資料互動了。如果有不好的地方希望大家可以給些建議,如果文章能夠幫助到你,那就再好不過了。