APP模塊化組件化

APP模塊化組件化

該庫部分思想借鑒了"得到"APP:

個人demo地址:MyComponent
得到開源地址: 得到APP

組件化緣故:
當(dāng)項目逐漸變大的時候,每次你改動了很小的一部分,你也需要重新編譯整個APP,舉個例子,修改了個人中心樣式顯示,就得重新編譯整個APP.當(dāng)隨著業(yè)務(wù)的增多,代碼變的越來越復(fù)雜,每個模塊之間的代碼耦合變得越來越嚴(yán)重,解耦問題急需解決,同時編譯時間也會越來越長。

組件化效果:
毫無懸念,組件化勢在必行,在網(wǎng)上看了很多相關(guān)的資料,對組件化有一個初步的了解,然后就開始組件化了,下面1以我自己的項目為例,放兩張實際項目已經(jīng)組件化之前跟之后的圖對比一下。

組件化之前.png

組件化之后.png

可以明顯的發(fā)現(xiàn)我們的Module變多了,組件化最大的好處就是可以模塊可以單獨開發(fā)調(diào)試,這樣效率一下子就上來了,就拿XX模塊舉例,XX實際上就只有三個界面:首頁|列表頁|詳情頁.可以說想慢都慢不下來.

組件化要點:

  • 組件與組件跳轉(zhuǎn)(Router)
  • 組件與組件之間依賴服務(wù)
  • 廣播(EventBus)
  • 組件以lib和application形式存在(可獨立運行)

組件化模塊介紹:

  • app(主項目,負(fù)責(zé)集成眾多組件,控制組件的生命周期)
  • basiclib(公共的基礎(chǔ)庫,一些第三方的庫(網(wǎng)絡(luò)圖片\請求\公共類等))
  • basicres(定義了全局通用的theme和color等公共資源)
  • build-gradle(組件化編譯的gradle插件,也是整個組件化方案的核心)
  • componentlib(組件化的基礎(chǔ)庫(比如router初始化))
  • componentservice(組件之間的服務(wù)庫)
  • hotelcomponent(模塊組件[測試用例])
  • sceniccomponent(模塊組件[測試用例])

組件化項目實際應(yīng)用:
在demo中初步實現(xiàn)的場景是:主項目app 集成Hotel和Scenic兩個組件,兩者提供fragment給app模塊調(diào)用,在這里就簡單的說下集成hotel的過程.

1.首先hotel組件在componentservice中定義自己的服務(wù)

/**
 * 獲取酒店列表
 * create by gengy 60167
 * at  18-3-21 下午5:36
 */
public interface GetHotelListService {

    Fragment GetHotelListFragment();
}

2.然后在hotel的組件工程中,提供具體的實現(xiàn)類

/**
 * 接口的實現(xiàn)(Impl拼錯了,大寫的尷尬,后面也會繼續(xù)維護(hù)demo,添加更完善的內(nèi)容)
 * create by gengy 60167
 * at  18-3-21 下午5:35
 */

public class HotelFragmentImlp implements GetHotelListService {

    @Override
    public Fragment GetHotelListFragment() {
        return new HotelListFragment();
    }
}

3.提供了具體的實現(xiàn)類之后,想要使用組件對外的服務(wù)需把實現(xiàn)類注冊到Router中,這里定義了onCreate和onStop兩個生命周期方法,對應(yīng)組件的加載和卸載。

public class HotelAppLike implements IApplicationLike {

    Router router = Router.getInstance();

    @Override
    public void onCreate() {
        router.addService(GetHotelListService.class.getSimpleName(), new HotelFragmentImlp());
    }

    @Override
    public void onStop() {
        router.removeService(GetHotelListService.class.getSimpleName());
    }
}

4.最后在主項目APP中面向Hotel提供的service找到提供的實現(xiàn)

private void setFragment() {
        fragmentManager = getSupportFragmentManager();

        homeFragment = new MainFragment();
        Router router = Router.getInstance();
        
        Router.registerComponent("com.jaygengi.hotel.applike.HotelAppLike");
        Router.registerComponent("com.jaygengi.scenic.applike.ScenicAppLike");

        GetHotelListService hotelListService = (GetHotelListService)router.getService(GetHotelListService.class.getSimpleName());
        GetScenicListService ScenicListService = (GetScenicListService)router.getService(GetScenicListService.class.getSimpleName());

        fragmentList = new ArrayList<Fragment>();
        fragmentList.add(homeFragment);
        fragmentList.add(hotelListService.GetHotelListFragment());//酒店列表
        fragmentList.add(ScenicListService.GetScenicListFragment());//景區(qū)列表
        setFrag();
    }

組件之間的通信通過廣播(EventBus)
demo中寫的是:Scenic中填寫內(nèi)容,button按鈕點擊把內(nèi)容替換到Hotel組件列表第一條酒店內(nèi)容中.
EventBus操作起來很簡單:

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new HotelData(edit.getText().toString()));
            }
        });

Hotel注冊EventBus并做處理

   @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.common_fragment_main, container, false);
        ButterKnife.bind(this, view);
        instance = this;
        //注冊EventBus
        EventBus.getDefault().register(this);
        setAdapter();
        loadData();
        return view;
    }
@Subscribe(threadMode = ThreadMode.MAIN)
    public void RfHotelData(HotelData hotel){
        hotelList.get(0).setHotelNm(hotel.getHotelNm());
        baseAdapter.setNewData(hotelList);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

組件化總結(jié):

利端:
  1. 每個模塊都可以單獨調(diào)試,節(jié)省編譯時間
  2. 可以共享工具類,網(wǎng)絡(luò)庫等
  3. 快速測試
  4. 公司業(yè)務(wù)繁重,可以不斷復(fù)用模塊,節(jié)省開發(fā)時間
  5. 積累開發(fā)工具(個人)
弊端:
  1. 組件之間存在業(yè)務(wù)聯(lián)系(componentService)
  2. 資源命令重復(fù)(組件中build.gradle resourcePrefix命名)
  3. 引用沖突(框架中添加了dependencies.gradle[作用:統(tǒng)一管理版本,第三方引用等])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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