Android組件化+MVVM+MVP+RxJava+Retrofit+Dagger2雙架構(gòu)框架FlyTour+FlyCloud微服務(wù)框架新聞客戶端升級(jí)版使用詳解

框架地址:https://github.com/geduo83/FlyTour

FlyTour是Android組件化+MVVM+MVP+RxJava+Retrofit+Dagger2組成的雙架構(gòu)框架藤乙,工程架構(gòu)采用gradle配置實(shí)現(xiàn)組件化燎窘,模塊的架構(gòu)采用典型的MVVM+MVP架構(gòu)各拷,MVVM和MVP根據(jù)自己的項(xiàng)目實(shí)際需求去決定使用,該框架是Android組件化、Android MVVM架構(gòu)碘菜、Android MVP架構(gòu)的集大成者,幫助你快速的搭建自己的App項(xiàng)目開(kāi)發(fā)框架,以便把主要的精力放在自己的項(xiàng)目的業(yè)務(wù)功能實(shí)現(xiàn)上室囊,另外在長(zhǎng)期的工作實(shí)踐中總結(jié)整理大量的實(shí)用工具類在項(xiàng)目lib_common組件的util包當(dāng)中方便大家調(diào)用。

本框架的最大的特點(diǎn)就是和FlyCloud微服務(wù)框架配合使用魁索,從移動(dòng)前端和服務(wù)后端的一套完整解決方案融撞,解決了很多開(kāi)發(fā)者只會(huì)前端不會(huì)后端的問(wèn)題,或者只會(huì)后端不會(huì)前端的問(wèn)題粗蔚,有了這兩套框架尝偎,我們的開(kāi)發(fā)不在受制于人。

通過(guò)不斷的升級(jí)迭代鹏控,該框架已經(jīng)有了七個(gè)不同的版本致扯,4.1.0【組件化+MVVM+RxJava+Retrofit+DataBinding升級(jí)版】4.0.0【組件化+MVVM+RxJava+Retrofit標(biāo)準(zhǔn)版】当辐、3.0.0【組件化+MVP+RxJava+Retrofit+Dagger2網(wǎng)絡(luò)版】急前、2.1.0【組件化+MVP+Dagger2版】2.0.0【組件化+MVP標(biāo)準(zhǔn)版】瀑构, 1.1.0【優(yōu)化版】裆针、1.0.0【初始版】,各個(gè)版本都有不同的特性寺晌,基本涵蓋了目前Android領(lǐng)域的主流開(kāi)發(fā)架構(gòu)世吨,能滿足不同階段的Android開(kāi)發(fā)者的使用需求,大家可根據(jù)自己的項(xiàng)目需求去選擇自己所需要的版本呻征。

FlyTour為組件化項(xiàng)目架構(gòu)耘婚,它由自己的開(kāi)源框架FlyTranslateFlyAndroidMVP基礎(chǔ)上孵化出來(lái)的框架陆赋,如果需要單一結(jié)構(gòu)體項(xiàng)目架構(gòu)請(qǐng)下載FlyTranslate【MVP+RxJava+Retrofit+Dagger2】FlyAndroidMVP【android mvp】

更新日志:

FlyTour 4.1.0【組件化+MVVM+RxJava+Retrofit+DataBinding升級(jí)版】 2019-07-07

組件化+MVVM+DataDinding+RxJava+Retrofit沐祷,在4.0.0的MVVM架構(gòu)基礎(chǔ)之上增加了DataBinding的特性嚷闭,配合FlyCloud微服務(wù)系統(tǒng)共同使用

  • 增加了DataBinding的特性

FlyTour 4.0.0【組件化+MVVM+RxJava+Retrofit標(biāo)準(zhǔn)版】 2019-07-03

組件化+MVVM+RxJava+Retrofit,基本架構(gòu)由3.0.0的MVP架構(gòu)升級(jí)為MVVM架構(gòu)赖临,配合FlyCloud微服務(wù)系統(tǒng)共同使用

  • MVVM架構(gòu)徹底改版

FlyTour 3.0.0【組件化+MVP+RxJava+Retrofit+Dagger2網(wǎng)絡(luò)版】 2019-06-26

組件化+MVP+RxJava+Retrofit+Dagger2,該版本是在2.1.0的版本的基礎(chǔ)之上對(duì)Model層的數(shù)據(jù)源做了升級(jí)胞锰,由本地?cái)?shù)據(jù)源升級(jí)為網(wǎng)絡(luò)數(shù)據(jù)源,配合FlyCloud微服務(wù)系統(tǒng)共同使用

  • 網(wǎng)絡(luò)請(qǐng)求部分由Retrofit+RxJava完成

FlyTour 2.1.0【組件化+MVP+Dagger2版】 2019-06-06

組件化+MVP+Dagger2兢榨,該版本在2.0.0的基礎(chǔ)上添加了Dagger2的特性嗅榕,Present、Model的創(chuàng)建都由Dagger2自動(dòng)完成

  • 1.Presenter實(shí)例的創(chuàng)建由Dagger2完成
  • 2.Modle實(shí)例的創(chuàng)建有Dagger2完成
  • 3.DAO實(shí)例的創(chuàng)建由Dagger2完成

FlyTour 2.0.0【組件化+MVP標(biāo)準(zhǔn)版】 2019-05-30

基本架構(gòu)為組件化+MVP吵聪,數(shù)據(jù)由本地SQLLite數(shù)據(jù)庫(kù)提供
以新聞資訊為功能凌那,對(duì)app的界面進(jìn)行了全新的改版,由新聞列表展示吟逝、新聞詳情展示帽蝶、新聞添加、新聞?lì)愋吞砑涌樵堋h除這幾個(gè)簡(jiǎn)單的功能組成励稳,基本上覆蓋了整個(gè)框架的所有核心的、常用的一些功能

  • 新聞?lì)愋吞砑泳质础h除、展示
  • 新聞添加恕稠、展示
  • 支持是否啟用ToolBar
  • 支持自定義ToolBar
  • 支持loading加載數(shù)據(jù)
  • 支持透明loading的加載數(shù)據(jù)
  • 支持顯示無(wú)數(shù)據(jù)
  • 支持網(wǎng)絡(luò)網(wǎng)絡(luò)錯(cuò)誤顯示
  • 支持Fragment的懶加載
  • 支持最基本的下拉刷新琅绅、上拉加載更多
  • 支持自定義HeadView和FootView
  • 支持自動(dòng)刷新
  • 支持啟用、禁用下拉刷新
  • 支持啟用鹅巍、進(jìn)攻上拉加載更多
  • 通用小菊花樣式DaisyRefreshLayout
  • 通用小箭頭樣式ArrowRefreshLayout

FlyTour 1.1.0【優(yōu)化版】 2019-03-34

  • MVP功能的一些優(yōu)化

FlyTour 1.0.0【初始版】 2019-01-26

  • 初始版本千扶,以車輛運(yùn)動(dòng)軌跡大數(shù)據(jù)采集為功能簡(jiǎn)單的實(shí)現(xiàn)了組件化和MVP的基本功能

功能演示

  • 啟動(dòng)頁(yè)


    啟動(dòng)頁(yè)
  • 新聞下來(lái)刷新、無(wú)數(shù)據(jù)骆捧、無(wú)網(wǎng)絡(luò)澎羞、新聞詳情展示


    新聞列表、新聞詳情

    無(wú)網(wǎng)絡(luò)
  • 新聞?lì)愋吞砑恿参⑿侣勌砑?/p>

    新聞?lì)愋吞砑?/div>

    新聞詳情添加

主要功能

核心公共組件lib_common

MVVM七大的核心公用基類

  • View層核接口IBaseView
interface IBaseView{
    void initView();
    void initListener();
    void initData();
    void finishActivity();
    void showInitLoadView(boolean show);
    void showNoDataView(boolean show);
    void showTransLoadingView(boolean show);
    void showNetWorkErrView(boolean show);
    Context getContext();
}
  • BaseActivity
abstract class BaseActivity implements IBaseView{
    public abstract int onBindLayout();
    public abstract void initView();
    public abstract void initData();
    public void initListener();
}
  • BaseMvvmActivity
abstract class BaseMvvmActivity extends BaseActivity{
 initViewDataBinding();
 initBaseViewObservable();
 initViewObservable();
}
  • BaseMvvmRefreshActivity
abstract class BaseMvvmRefreshActivity extends BaseMvvmActivity{
  private void initBaseViewRefreshObservable();
    public abstract DaisyRefreshLayout getRefreshLayout();
    public void initRefreshView();
    public void stopRefresh();
    public void stopLoadMore();
    public void autoLoadData();
}
  • BaseFragment
class BaseFragment implements IBaseView{
   initCommonView(mView);
        initView(mView);
        initListener();
}
  • BaseMvvmFragment
class BaseMvvmFragment extends BaseFragment{
  initViewModel();
        initBaseViewObservable();
        initViewObservable();
}
  • BaseMvvmRefreshFragment
class BaseMvvmRefreshFragment extends BaseMvvmFragment{
    private void initBaseViewRefreshObservable();
     public abstract DaisyRefreshLayout getRefreshLayout();
        public void initRefreshView();
        public void stopRefresh();
        public void stopLoadMore();
        public void autoLoadData() ;
}

MVP七大的核心公用基類

  • BaseActivity
public abstract class BaseActivity extends RxAppCompatActivity implements BaseView {
...
}
  • BaseMvpActivity
public abstract class BaseMvpActivity<M extends BaseModel,V,P extends BasePresenter<M,V>> extends BaseActivity {
...
}
  • BaseRefreshActivity
public abstract class BaseRefreshActivity<M extends BaseModel, V extends BaseRefreshView<T>, P extends BaseRefreshPresenter<M, V, T>, T> extends BaseMvpActivity<M, V, P> implements BaseRefreshView<T> {
}
  • BaseFragment
  • BaseMvpFragment
  • BaseRefreshFragment
  • BaseAdapter

功能特色:

  • 支持是否使用ToolBar
public boolean enableToolbar() {
    return true;
}
  • 支持自定義ToolBar
public int onBindToolbarLayout() {
   return R.layout.common_toolbar;
}
  • 支持loading加載數(shù)據(jù)
  public void showInitLoadView() {
        showInitLoadView(true);
    }

    public void hideInitLoadView() {
        showInitLoadView(false);
    }
  • 支持透明loading的加載數(shù)據(jù)
  @Override
    public void showTransLoadingView() {
        showTransLoadingView(true);
    }

    @Override
    public void hideTransLoadingView() {
        showTransLoadingView(false);
    }
  • 支持顯示無(wú)數(shù)據(jù)
    public void showNoDataView() {
        showNoDataView(true);
    }

    public void showNoDataView(int resid) {
        showNoDataView(true, resid);
    }

    public void hideNoDataView() {
        showNoDataView(false);
    }
  • 支持網(wǎng)絡(luò)網(wǎng)絡(luò)錯(cuò)誤顯示
public void hideNetWorkErrView() {
        showNetWorkErrView(false);
    }

    public void showNetWorkErrView() {
        showNetWorkErrView(true);
    }

  • 支持Fragment的懶加載
  private void lazyLoad() {
        //這里進(jìn)行雙重標(biāo)記判斷,必須確保onCreateView加載完畢且頁(yè)面可見(jiàn),才加載數(shù)據(jù)
         if (isViewCreated && isViewVisable) {
            initData();
            //數(shù)據(jù)加載完畢,恢復(fù)標(biāo)記,防止重復(fù)加載
            isViewCreated = false;
            isViewVisable = false;
        }
    }
    //默認(rèn)不啟用懶加載
    public boolean enableLazyData() {
        return false;
    }

上拉下拉功能組件 lib_refresh_layout

  • 支持最基本的下拉刷新妆绞、上拉加載更多
  • 支持自定義HeadView和FootView
  • 支持自動(dòng)刷新
  • 支持啟用、禁用下拉刷新
  • 支持啟用枫攀、進(jìn)攻上拉加載更多
  • 通用小菊花樣式DaisyRefreshLayout
  • 通用小箭頭樣式ArrowRefreshLayout

項(xiàng)目架構(gòu)

在這里插入圖片描述
  • 集成模式:所有的業(yè)務(wù)組件被“app殼工程”依賴括饶,組成一個(gè)完整的APP;
  • 組件模式:可以獨(dú)立開(kāi)發(fā)業(yè)務(wù)組件来涨,每一個(gè)業(yè)務(wù)組件就是一個(gè)APP图焰;
  • app殼工程:負(fù)責(zé)管理各個(gè)業(yè)務(wù)組件,和打包apk蹦掐,沒(méi)有具體的業(yè)務(wù)功能技羔;
  • 業(yè)務(wù)組件:根據(jù)公司具體業(yè)務(wù)而獨(dú)立形成一個(gè)的工程僵闯;
  • 功能組件:提供開(kāi)發(fā)APP的某些基礎(chǔ)功能,例如打印日志藤滥、下拉刷新控件等鳖粟;
  • Main組件:屬于業(yè)務(wù)組件,指定APP啟動(dòng)頁(yè)面超陆、主界面牺弹;
  • Common組件:屬于功能組件,支撐業(yè)務(wù)組件的基礎(chǔ)时呀,提供多數(shù)業(yè)務(wù)組件需要的功能

MVVM架構(gòu)

在這里插入圖片描述
  • View層類關(guān)系圖


    在這里插入圖片描述
  • ViewModel層類關(guān)系圖


    在這里插入圖片描述
  • model層類關(guān)系圖


    在這里插入圖片描述

MVP架構(gòu)

這是整個(gè)項(xiàng)目的mvp結(jié)構(gòu)圖:


在這里插入圖片描述
  • Activity關(guān)系圖:

    在這里插入圖片描述

Fragment的類關(guān)系圖

Fragment的類關(guān)系圖和Activity類似具體詳見(jiàn)common組件下的base包和mvp包

組件化實(shí)現(xiàn):

FlyTour新聞客戶端使用阿里ARouter作為路由张漂,實(shí)現(xiàn)組件與組件的通信跳轉(zhuǎn)

集成模式和組件模式轉(zhuǎn)換

Module的屬性是在每個(gè)組件的 build.gradle 文件中配置的,當(dāng)我們?cè)诮M件模式開(kāi)發(fā)時(shí)谨娜,業(yè)務(wù)組件應(yīng)處于application屬性航攒,這時(shí)的業(yè)務(wù)組件就是一個(gè) Android App,可以獨(dú)立開(kāi)發(fā)和調(diào)試趴梢;而當(dāng)我們轉(zhuǎn)換到集成模式開(kāi)發(fā)時(shí)漠畜,業(yè)務(wù)組件應(yīng)該處于 library 屬性,這樣才能被我們的“app殼工程”所依賴坞靶,組成一個(gè)具有完整功能的APP

先打開(kāi)FlyTour工程的根目錄下找到gradle.properties 文件憔狞,然后將 isModule 改為你需要的開(kāi)發(fā)模式(true/false), 然后點(diǎn)擊 "Sync Project" 按鈕同步項(xiàng)目

isModule=false
在這里插入圖片描述
if (isModule.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}
在這里插入圖片描述

組件之間AndroidManifest合并問(wèn)題

我們可以為組件開(kāi)發(fā)模式下的業(yè)務(wù)組件再創(chuàng)建一個(gè) AndroidManifest.xml彰阴,然后根據(jù)isModule指定AndroidManifest.xml的文件路徑瘾敢,讓業(yè)務(wù)組件在集成模式和組件模式下使用不同的AndroidManifest.xml,這樣表單沖突的問(wèn)題就可以規(guī)避了
已module_main組件為例配置如下:


在這里插入圖片描述
sourceSets {
        main {
            if (isModule.toBoolean()) {
                manifest.srcFile 'src/main/module/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
}

組件模式下的Application

在每個(gè)組件的debug目錄下創(chuàng)建一個(gè)Application并在module下的AndroidManifest.xml進(jìn)行配置
配圖:


在這里插入圖片描述

集成開(kāi)發(fā)模式下的Application

在這里插入圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尿这,一起剝皮案震驚了整個(gè)濱河市簇抵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌射众,老刑警劉巖碟摆,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叨橱,居然都是意外死亡典蜕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)罗洗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘉裤,“玉大人,你說(shuō)我怎么就攤上這事栖博⌒汲瑁” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵仇让,是天一觀的道長(zhǎng)典奉。 經(jīng)常有香客問(wèn)我躺翻,道長(zhǎng),這世上最難降的妖魔是什么卫玖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任公你,我火速辦了婚禮,結(jié)果婚禮上假瞬,老公的妹妹穿的比我還像新娘陕靠。我一直安慰自己,他們只是感情好脱茉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布剪芥。 她就那樣靜靜地躺著,像睡著了一般琴许。 火紅的嫁衣襯著肌膚如雪税肪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天榜田,我揣著相機(jī)與錄音益兄,去河邊找鬼。 笑死箭券,一個(gè)胖子當(dāng)著我的面吹牛净捅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辩块,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蛔六,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了庆捺?” 一聲冷哼從身側(cè)響起古今,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屁魏,失蹤者是張志新(化名)和其女友劉穎滔以,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體氓拼,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡你画,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桃漾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坏匪。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撬统,靈堂內(nèi)的尸體忽然破棺而出适滓,到底是詐尸還是另有隱情,我是刑警寧澤恋追,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布凭迹,位于F島的核電站罚屋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅绸。R本人自食惡果不足惜脾猛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鱼鸠。 院中可真熱鬧猛拴,春花似錦、人聲如沸蚀狰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)造锅。三九已至撼唾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哥蔚,已是汗流浹背倒谷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糙箍,地道東北人渤愁。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像深夯,于是被迫代替她去往敵國(guó)和親抖格。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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