Android Jetpack架構開發組件化應用實戰

本文首發於微信公衆號「Android開發之旅」,歡迎關注

項目介紹

本項目採用組件化+MVVM架構進行開發,對功能組件和業務組件進行拆分,經過ARouter進行組件之間的通訊。本文主要是對整個應用的技術架構做一個簡單的介紹。git

項目地址:https://github.com/winlee28/J... 歡迎stargithub

技術要點

Kotlin+Jetpack+Coroutines+Retrofit+koin

項目總體架構圖:緩存

宿主App沒有任何的業務代碼,整個業務被拆分爲各個ft_lib模塊。對一些功能組件進行封裝抽取爲lib,提供給上層依賴。ft_lib之間沒有任務依賴關係,經過Arouter進行通訊。微信

首頁功能

首頁分爲5個Tab,主要爲首頁、項目、導航、體系和個人。網絡

整個頁面框架使用BottomNavigationView + Navigation來搭建。經過menu來配置底部菜單。
經過NavHostFragment來配置各個fragment。系統提供的FragmentNavigator的navigate方法中是經過replace來加載fragment。
這就致使在切換Tab的時候fargment會重複的調用onCreateView方法。這確定不是咱們須要的。那麼咱們須要自定義本身的FragmentNavigator來替換系統
的,經過show和hide的方式來加載fragment。具體方式會在後續系列文章中進行講解。架構

由於App使用了沉浸式狀態欄,那麼在使用的過程當中也會出現只有第一個fragment的沉浸式是起做用的,其餘的基本不生效。這個問題要從系統源碼着手解決。
根本緣由是這段代碼:框架

private WindowInsets brokenDispatchApplyWindowInsets(WindowInsets insets) {
        if (!insets.isConsumed()) {
            final int count = getChildCount();
            for (int i = 0; i < count; i++) {
                insets = getChildAt(i).dispatchApplyWindowInsets(insets);
                if (insets.isConsumed()) {
                    break;
                }
            }
        }
        return insets;
    }

直接break了。因此咱們也須要自定義一個view來重寫dispatchApplyWindowInsets方法。具體也會在後續文章中進行講解。ide

下面就簡單介紹下各個Tab的技術要點。組件化

首頁

首頁主要分爲頂部Banner和底部的文章列表。列表使用Paging加載。
而且封裝了AbsListFragment和AbsListViewModel來快速搭建列表頁面。
AbsListFragment主要是封裝了頁面佈局相關的元素。
AbsListViewModel主要是封裝了paging的一些經常使用配置等信息。
經過上述兩個封裝咱們在開發列表頁面的時候只須要關係DataSource和adapter便可。佈局

項目

項目Tab主要使用的是TabLayout和ViewPager2來配合實現聯動。一樣的ViewPager2的頁面也是直接繼承了AbsListFragment
來實現列表頁面。

導航

導航頁面主要分爲頂部的搜索和底部的分類。點擊搜索後打開新的頁面。經過fragment來承載熱門搜索和搜索返回結果。
底部的分類主要是經過RecyclerView+ViewPager2來實現的。經過設置ViewPager2的orientation爲ORIENTATION_VERTICAL來實現列表滑動。

體系

經過自定義FlowLayout來實現Tag標籤管理。並進一步封裝TagFlowLayout並對外提供TagAdapter來加載數據。

全部的下拉刷新換個下拉加載都是經過SmartRefreshLayout來實現的。經過閱讀Paging源碼咱們瞭解到當請求數據返回空數據的時候,那麼Paging就
不會繼續幫咱們來作分頁加載了,默認會認爲數據已經加載結束了。這個邏輯在實際開發中是有些問題的。因此就須要咱們來返回空數據的時候手動來加載
分頁邏輯。這裏是經過自定義DataSource來完成。其實Paging框架只提供了加載數據的方式,在增長或者刪除的邏輯目前都是不不支持的。這些均可以經過自定義
DataSource來完成。具體也會在後續文章中進行講解。

網絡請求

主要仍是經過Retrofit+協程來完成。整個應用的數據流向架構爲:

目前還未加緩存功能,後續會經過room來實現緩存功能。

組件通訊

組件通訊主要是經過Arouter來實現的。經過提供的IProvider來定義Service來完成。Service的實現定義在各自的module中。
並在base模塊中定義ServiceImpl的包裝類共調用方調用,這樣對方就無需關心業務邏輯,直接使用便可。

依賴注入

由於App是採用Kotlin來開發的,因此 沒有選擇dagger2而是選擇了Koin,適用於 Kotlin 開發人員的實用輕量級依賴注入框架。
用純 Kotlin 編寫,無代理,無代碼生成,無反射。

學習地址 :https://start.insert-koin.io/...

以上就是整個App功能的簡單介紹,後續會單獨講解一些技術要點。

掃描下方二維碼關注公衆號,獲取更多技術乾貨。

相關文章
相關標籤/搜索