教你用builder模式封裝網(wǎng)絡(luò)請(qǐng)求

從今天開(kāi)始跌榔,我決定做一件有意義的事异雁,逐步開(kāi)源一些我認(rèn)為很有價(jià)值的項(xiàng)目并附帶一些深度的原理分析。給那些想要提高android開(kāi)發(fā)技術(shù)水平僧须,但又沒(méi)有思路的同學(xué)一些方法上的啟迪纲刀。同時(shí)也可以宏觀上擴(kuò)展個(gè)人的技術(shù)視野和眼界。下面開(kāi)始第一個(gè)開(kāi)源項(xiàng)目的深度講解担平,大家一起來(lái)吧示绊。

項(xiàng)目名稱DDNetCore,封裝這個(gè)框架的主要目的是簡(jiǎn)化網(wǎng)絡(luò)數(shù)據(jù)的獲取,解析過(guò)程暂论,讓業(yè)務(wù)開(kāi)發(fā)者從處理網(wǎng)絡(luò)數(shù)據(jù)獲取的復(fù)雜事務(wù)中解脫出來(lái)面褐,將更多的關(guān)注點(diǎn)放在業(yè)務(wù)邏輯的開(kāi)發(fā)上面。

項(xiàng)目git地址:https://github.com/jessie345/DDNetCore

下面我嘗試以一種更容易理解的方式說(shuō)明這個(gè)框架的使用方式和工作原理取胎。首先來(lái)一張框架流程圖展哭,可以從宏觀的角度理解下框架內(nèi)部交互的大體過(guò)程。


數(shù)據(jù)請(qǐng)求框架.png

現(xiàn)在扼菠,我們按照流程圖描述的執(zhí)行順序摄杂,逐步闡述框架的使用方式及原理。

發(fā)起數(shù)據(jù)請(qǐng)求的第一步需要實(shí)例化請(qǐng)求對(duì)象循榆,并塞給RequestManager 執(zhí)行析恢。原生的方式需要為不同的請(qǐng)求創(chuàng)建不同的Request子類(lèi),子類(lèi)中處理請(qǐng)求相關(guān)的邏輯(覆寫(xiě)相關(guān)的回掉方法)并實(shí)例化秧饮。但是這種方式帶來(lái)一個(gè)問(wèn)題映挂,對(duì)于大多數(shù)請(qǐng)求泽篮,請(qǐng)求及響應(yīng)結(jié)果的處理邏輯基本相同,為了減少創(chuàng)建子類(lèi)的重復(fù)勞動(dòng)柑船,網(wǎng)絡(luò)庫(kù)提供了DataRequestBuilder 構(gòu)建器帽撑,通過(guò)他,可以創(chuàng)建通用的對(duì)象請(qǐng)求(返回結(jié)果可以對(duì)等一個(gè)bean)鞍时,列表請(qǐng)求實(shí)例(返回結(jié)果可以對(duì)比成List<Bean>)亏拉。這個(gè)模式極大的簡(jiǎn)化了發(fā)起請(qǐng)求需要執(zhí)行的前期工作,讓你編寫(xiě)數(shù)據(jù)接口的工作相當(dāng)簡(jiǎn)單逆巍,我舉個(gè)例子:

  Request request = DataRequestBuilder.asArrayRequest("/products")
                .requestId(REQUEST_FETCH_PRODUCTS)
                .requestDefaultStrategy(Constants.STRATEGY_LEVEL3_CACHE)
                .requestExpireStrategy(Constants.STRATEGY_REFRESH_CACHE)
                .memoryCache()
                .dbCache()
                .dataClass(ProductBean.class)
                .httpMethod(Constants.HTTP_METHOD_GET)
                .build();

上面幾行代碼創(chuàng)建了一個(gè)獲取產(chǎn)品列表的數(shù)據(jù)請(qǐng)求及塘,第一行代碼指定了創(chuàng)建一個(gè)路徑為/products的數(shù)組請(qǐng)求,即服務(wù)器返回的數(shù)據(jù)是個(gè)列表锐极。第二行代碼為請(qǐng)求指定了id笙僚,通過(guò)這個(gè)id,我在響應(yīng)回調(diào)里可以非常容易的區(qū)分哪個(gè)請(qǐng)求的結(jié)果返回了灵再。第三第四行代碼分別指明了默認(rèn)情況和請(qǐng)求響應(yīng)結(jié)果過(guò)期情況的請(qǐng)求執(zhí)行策略,框架提供三種數(shù)據(jù)請(qǐng)求策略肋层,分別為:Constants.STRATEGY_LEVEL3_CACHE(三級(jí)緩存策略),Constants.STRATEGY_REFRESH_CACHE(強(qiáng)制刷新緩存策略)翎迁,Constants.STRATEGY_ONLY_NET(強(qiáng)制請(qǐng)求網(wǎng)絡(luò)策略)栋猖。第五行第六行指定請(qǐng)求是否使用內(nèi)存和數(shù)據(jù)庫(kù)緩存。第七行指定用哪個(gè)class反序列化服務(wù)器返回的數(shù)據(jù)汪榔。倒數(shù)第二行指定了請(qǐng)求的執(zhí)行方式為get,框架同時(shí)內(nèi)置了對(duì)兩種基本請(qǐng)求方式的支持,Constants.HTTP_METHOD_GET(基本get請(qǐng)求方式),Constants.HTTP_METHOD_POST(post 請(qǐng)求方式掂铐,post的content-type可以為application/json,www-form-urlencoded)

有了request實(shí)例,我們可以將它交給RequestManager執(zhí)行了揍异。我在BaseActivity中封裝了如下代碼:

    public void enqueueRequest(Request request) {
        if (!mNetworkControl.isControlListenerRegistered(this)) {
            mNetworkControl.registerControlListener(this);
        }

        mNetworkControl.enqueueRequest(request);
    }

通過(guò)NetWorkControl實(shí)例,將請(qǐng)求交給RequestManager執(zhí)行爆班,NetWorkControl中會(huì)執(zhí)行一些與取消請(qǐng)求相關(guān)的邏輯衷掷。

請(qǐng)求已經(jīng)提交到線程池執(zhí)行,那么我們?nèi)绾谓邮辗祷氐臄?shù)據(jù)結(jié)果呢柿菩。NetworkControl 類(lèi)提供了獲取響應(yīng)結(jié)果的監(jiān)聽(tīng)函數(shù):

    public void registerControlListener(@NonNull NetworkControlListener listener) {
        Preconditions.checkNotNull(listener);
        this.mListenerRef = new WeakReference(listener);
    }

注冊(cè)監(jiān)聽(tīng)后戚嗅,通過(guò)如下三個(gè)與請(qǐng)求生命周期相關(guān)的回調(diào),就可以獲取請(qǐng)求及響應(yīng)的相關(guān)信息啦枢舶。

    public void handlePreNetRequest(@NonNull Request request) {
    }

    @Override
    public void handleNetRequestError(@NonNull Request request, @NonNull ResponseHeader rb) {
    }

    @Override
    public void handleReceivedResponse(@NonNull EventResponse event) {
    }

handlePreNetRequest 表示某個(gè)請(qǐng)求即將添加到請(qǐng)求隊(duì)列執(zhí)行懦胞。handleNetRequestError 表示某個(gè)請(qǐng)求發(fā)生了錯(cuò)誤。handleReceivedResponse 表示請(qǐng)求的結(jié)果正確返回凉泄。通過(guò)這三個(gè)方法就能判斷Request的執(zhí)行狀態(tài)了躏尉。

體會(huì)一下,寫(xiě)一個(gè)請(qǐng)求接口是不是很簡(jiǎn)單后众。

如果想了解更多信息或者對(duì)開(kāi)源項(xiàng)目感興,請(qǐng)加我的微信公眾號(hào)胀糜,我在那里等你

小熊的開(kāi)源社區(qū).jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颅拦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子教藻,更是在濱河造成了極大的恐慌距帅,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括堤,死亡現(xiàn)場(chǎng)離奇詭異碌秸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)悄窃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)讥电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人广匙,你說(shuō)我怎么就攤上這事允趟。” “怎么了鸦致?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵潮剪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我分唾,道長(zhǎng)抗碰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任绽乔,我火速辦了婚禮弧蝇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘折砸。我一直安慰自己看疗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布睦授。 她就那樣靜靜地躺著两芳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪去枷。 梳的紋絲不亂的頭發(fā)上怖辆,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音删顶,去河邊找鬼竖螃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛逗余,可吹牛的內(nèi)容都是我干的特咆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼录粱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坚弱!你這毒婦竟也來(lái)了蜀备?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荒叶,失蹤者是張志新(化名)和其女友劉穎碾阁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體些楣,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脂凶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愁茁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚕钦。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鹅很,靈堂內(nèi)的尸體忽然破棺而出嘶居,到底是詐尸還是另有隱情,我是刑警寧澤促煮,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布邮屁,位于F島的核電站,受9級(jí)特大地震影響菠齿,放射性物質(zhì)發(fā)生泄漏佑吝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一绳匀、第九天 我趴在偏房一處隱蔽的房頂上張望芋忿。 院中可真熱鬧,春花似錦疾棵、人聲如沸戈钢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逆趣。三九已至,卻和暖如春嗜历,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抖所。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工梨州, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人田轧。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓暴匠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親傻粘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子每窖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,331評(píng)論 0 6
  • iOS網(wǎng)絡(luò)編程讀書(shū)筆記 Facade Tester客戶端門(mén)面模式的實(shí)例(被動(dòng)版本化) 被動(dòng)版本化帮掉,所以硬編碼URL...
    melouverrr閱讀 1,606評(píng)論 3 7
  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP、TCP窒典、Http蟆炊、Socket、X...
    Carden閱讀 4,337評(píng)論 0 12
  • 今天是第三十三個(gè)教師節(jié)瀑志,收到了孩子們的很多小禮物和和遠(yuǎn)在外地遙遠(yuǎn)的祝福涩搓,尤其是一些感覺(jué)還是四五年前的那個(gè)孩子但不經(jīng)...
    楚言初語(yǔ)閱讀 182評(píng)論 0 0
  • 你我不過(guò)驀然回首 來(lái)不及嫣然一笑 就已各奔東西 不再相見(jiàn) 你我也許輕舟小曲 等得到斷橋殘雪 卻已相敬如賓 不再相念...
    febe01fa282d閱讀 111評(píng)論 0 1