提供優(yōu)質(zhì)文章和福利的客戶端:Gank

前言

很久之前就在關(guān)注代碼家每日共享的學(xué)習(xí)資源晤揣,獲益匪淺屋确。

最近比較空閑纳击,并且想自己構(gòu)建一個完整項目,來了解自己的不足攻臀,剛好Gank提供了API焕数,于是決定一試。

項目地址:TigerGank

效果展示

頁面 效果
首頁效果
網(wǎng)絡(luò)狀態(tài)
每日詳情

第三方庫

項目框架

首先刨啸,整體的項目框架堡赔,采用MVP框架。

關(guān)于Android框架呜投,還是比較自由的加匈。根據(jù)需求去選擇自己喜歡的框架就可以。

這里我想加深一下自己對MVP框架的理解仑荐,于是選擇采用MVP框架雕拼。

關(guān)于MVC、MVP粘招、MVVM的框架含義啥寇,可以參考此篇短文,言簡意賅洒扎。

該項目的框架基本仿照Google開源的Android框架模板辑甜。

雖然存在一些差異,不過大同小異袍冷。

BaseActivity

一個好的基類磷醋,可以大大減少后續(xù)的工作量。

首先胡诗,我們來稍微屢一下全局的要求:

  • 標題欄:基本所有頁面都會有邓线,但是有些頁面可能需要定制化,甚至可能沒有煌恢。

  • 頁面控制:此處是一大頭骇陈,包括Loading、無網(wǎng)瑰抵、無數(shù)據(jù)你雌、數(shù)據(jù)展示等多種頁面樣式以及展示邏輯。

綜上二汛,我認為我們需要為BaseActivity設(shè)置一個layout文件婿崭,它持有ToolBar和各個狀態(tài)的頁面UI拨拓,并且可以控制頁面UI的展示時機。

在子Activity中逛球,繼承BaseActivity后只需設(shè)置數(shù)據(jù)UI的樣式即可千元。

接下來我們就開始構(gòu)建BaseActivity苫昌,首先來構(gòu)建BaseActivity的layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/c_ffffff"
    android:orientation="vertical">

    <!--ToolBar-->
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/c_3f51b5"
        android:minHeight="?attr/actionBarSize" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <!--Loading Page-->
        <include
            android:id="@+id/view_loading"
            layout="@layout/view_loading"
            android:visibility="gone" />

        <!--無數(shù)據(jù) Page-->
        <include
            android:id="@+id/view_no_data"
            layout="@layout/view_no_data"
            android:visibility="gone" />

        <!--無網(wǎng) Page-->
        <include
            android:id="@+id/view_no_net"
            layout="@layout/view_no_net"
            android:visibility="gone" />

        <!--數(shù)據(jù) Page-->
        <FrameLayout
            android:id="@+id/view_data"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone" />

    </FrameLayout>

</LinearLayout>

可以看到颤绕,它包括了ToolBar、LoadingPage祟身、無數(shù)據(jù)Page奥务、無網(wǎng)Page以及數(shù)據(jù)Page。

接下來我們在BaseActivity中對控件進行初始化袜硫,開始書寫頁面狀態(tài)的控制代碼氯葬。

此處各位看官要有意識,這些控制代碼婉陷,不應(yīng)存在于BaseActivit中帚称。

原因有很多,首先因為Activity是我們MVP的View層秽澳,它僅僅掌控UI變化的結(jié)果闯睹,而不應(yīng)該持有UI變化的邏輯判斷。其次担神,如果我們將來封裝BaseFragment楼吃,難道需要將這些邏輯代碼再寫一遍應(yīng)用至BaseFragment中嗎?

所以這里我決定在BaseActivity中創(chuàng)建成員變量PageController妄讯。每個Activity都會有一個獨立的PageController孩锡,它持有Activity,來通知Activity的UI變化亥贸,并且和Activity擁有相同的生命周期:

//頁面狀態(tài)控制器躬窜,每個頁面持有一個,使用弱引用來持有Activity
//存在于BaseActivity中炕置,無需手動控制荣挨,在頁面銷毀時自動釋放
public class PageController {
    //Activity對象
    private WeakReference<BaseActivity> weakActivity;
    //當前頁面狀態(tài)
    private int currentState;

    public PageController(BaseActivity activity) {

        weakActivity = new WeakReference<>(activity);
    }
    //銷毀方法
    public void onDestory() {
        if (weakActivity == null) {
            return;
        }
        weakActivity.clear();
        weakActivity = null;
    }
}

接下來就開始構(gòu)建具體的頁面控制邏輯。

這個邏輯因人而異讹俊,我這里就不介紹自己構(gòu)建時的思路了垦沉,源碼里的注釋都有體現(xiàn)。

在完成PageController后仍劈,當你需要構(gòu)建BaseFragment時厕倍,僅僅需要將fragment.getAcitivty()傳遞至PageController中,就可以使用PageController了贩疙。

網(wǎng)絡(luò)請求

使用okhttp來作為本次開發(fā)的網(wǎng)絡(luò)請求底層讹弯。

再好的框架况既,想要適應(yīng)一個項目,必定需要進行定制化的封裝组民。

在封裝之前棒仍,先回想一下一次完整的網(wǎng)絡(luò)請求,注意我們項目是MVP框架:

用戶在Activity中發(fā)出請求—>調(diào)用Presenter層的網(wǎng)絡(luò)請求方法->調(diào)用Model層的網(wǎng)絡(luò)請求方法->傳遞給Presenter請求結(jié)果以及數(shù)據(jù)->傳遞給Activity結(jié)果以及數(shù)據(jù)

在MVP框架下臭胜,一次網(wǎng)絡(luò)請求基本就是這樣的了莫其。
不過這就牽扯到框架問題了,我們先回到網(wǎng)絡(luò)請求中耸三,不去考慮框架乱陡。

如何最大限度的抽象,是我們現(xiàn)在要著重考慮的仪壮。

并且還要考慮并發(fā)憨颠、緩存、異步同步等一系列事情积锅。

該項目的網(wǎng)絡(luò)請求封裝簡直不忍直視爽彤,基本是本著能用就行的思想來進行封裝的。缚陷。适篙。

我發(fā)現(xiàn)此處是我的薄弱項,在將來有空時我會好好學(xué)習(xí)的蹬跃。匙瘪。。蝶缀。

這里就不做過多介紹了丹喻,其實網(wǎng)上有很多基于okhttp封裝相當好的網(wǎng)絡(luò)請求框架,想使用的話也可以使用翁都。

TODO

到目前為止碍论,還有一些功能沒有開發(fā):

  • Activity切換動畫

    Activity之間的切換看似一瞬間,其實我個人認為還是很重要的柄慰。上下配合的流程型頁面應(yīng)該使用左右橫屏進入和關(guān)閉鳍悠,給人一種流暢、步驟的感覺坐搔。兩個毫無關(guān)聯(lián)的頁面藏研,應(yīng)該給人一種打開全新界面的動畫感等等。

  • 搜索功能

    Gank的API中擁有搜索的API概行,該功能在后續(xù)會去實現(xiàn)蠢挡。

  • 網(wǎng)絡(luò)請求優(yōu)化

    從該項目當中,我發(fā)現(xiàn)自己對網(wǎng)絡(luò)請求的理解和Android文件存儲的方式存在很多問題,等到有空业踏,我會將網(wǎng)絡(luò)請求這邊重構(gòu)禽炬,包括添加File緩存、異步同步請求勤家、文件上傳接收請求等一系列基本功能腹尖。

  • RxJava+Retrofit

    本項目當中沒有使用RxJava。在后期有空我會重新再寫一遍該項目伐脖,會使用RxJava和其他框架來實現(xiàn)热幔,這算是立一個flag吧。

結(jié)語

這一周的精力除了完成本職工作外晓殊,基本上都放到了TigerGank中断凶。

我會慢慢抽空繼續(xù)完善該項目伤提,這周就先這樣了巫俺。

開發(fā)過程中遇到很多瓶頸,解決瓶頸的代碼肯定是不優(yōu)雅的肿男。主要還是因為自己的水平太差介汹。

一起加油,感興趣的朋友也可以自己開發(fā)Gank舶沛。

感謝

上述所有第三方庫

Gank API

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘹承,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子如庭,更是在濱河造成了極大的恐慌叹卷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坪它,死亡現(xiàn)場離奇詭異骤竹,居然都是意外死亡,警方通過查閱死者的電腦和手機往毡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門蒙揣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人开瞭,你說我怎么就攤上這事懒震。” “怎么了嗤详?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵个扰,是天一觀的道長。 經(jīng)常有香客問我葱色,道長递宅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮恐锣,結(jié)果婚禮上茅主,老公的妹妹穿的比我還像新娘。我一直安慰自己土榴,他們只是感情好诀姚,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玷禽,像睡著了一般赫段。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矢赁,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天糯笙,我揣著相機與錄音,去河邊找鬼撩银。 笑死给涕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的额获。 我是一名探鬼主播够庙,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抄邀!你這毒婦竟也來了耘眨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤境肾,失蹤者是張志新(化名)和其女友劉穎剔难,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奥喻,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡偶宫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衫嵌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片读宙。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖楔绞,靈堂內(nèi)的尸體忽然破棺而出结闸,到底是詐尸還是另有隱情,我是刑警寧澤酒朵,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布桦锄,位于F島的核電站,受9級特大地震影響蔫耽,放射性物質(zhì)發(fā)生泄漏结耀。R本人自食惡果不足惜留夜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望图甜。 院中可真熱鬧碍粥,春花似錦、人聲如沸黑毅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矿瘦。三九已至枕面,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缚去,已是汗流浹背潮秘。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留易结,地道東北人枕荞。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像衬衬,于是被迫代替她去往敵國和親买猖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評論 25 707
  • 轉(zhuǎn)載至:http://www.reibang.com/p/9a6845b26856 “Android MVP 詳解...
    SnowDragonYY閱讀 10,319評論 5 241
  • 作者:李旺成 時間:2016年4月3日 “Android MVP 詳解(下)”已經(jīng)發(fā)布滋尉,歡迎大家提建議。 MVP ...
    diygreen閱讀 128,817評論 86 1,321
  • Familymart飞主、7-11這樣的便利店為什么勢頭正猛狮惜?因為單身個體是增長最快的消費群體。這個增速之猛還可...
    哦呵呀閱讀 317評論 0 0
  • 自我預(yù)言的實現(xiàn)課程感受: 武老師今天分享自戀的兩個維度:我是對的碌识,我比你高一等碾篡。 我是對的是大部分人都在追求的價值...
    嘟嘟敏閱讀 575評論 0 0