你還在用 Retrofit + RxJava 嗎? 不不, OkHttps 一個就夠啦肴盏!

第一篇:OkHttp 優(yōu)雅封裝 OkHttps 之 氣海雪山初探
第二篇:OkHttp 優(yōu)雅封裝 OkHttps 之 上傳下載解密
第三篇:OkHttp 優(yōu)雅封裝 OkHttps 之 回調(diào)線程魔變

簡介

OkHttps 是 OkHttp 的超輕量封裝包科盛。

和 Retrofit 相比,它更加輕量(只有 59Kb)菜皂,是 Retrofit (124Kb)的一半贞绵,而且更加的開箱即用,API 更加自然和語義化恍飘。

OkHttps 用起來很優(yōu)美榨崩,可以鏈式調(diào)用,有點像 RxJava 卻比 RxJava 更簡單章母。

中文官網(wǎng):http://okhttps.ejlchina.com/

項目地址

Gitee:https://gitee.com/ejlchina-zhxu/okhttps
GitHub:https://github.com/ejlchina/okhttps

起步

Maven

<dependency>
     <groupId>com.ejlchina</groupId>
     <artifactId>okhttps</artifactId>
     <version>1.0.4</version>
</dependency>

Gradle

implementation 'com.ejlchina:okhttps:1.0.4'

安卓中使用需要把 JDK 版本調(diào)成 1.8母蛛,在 app 模塊的 build.gradle 中加入以下配置即可:

android {
    // 省略其它配置..
    compileOptions {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }
}

在正式開始之前,我們依然假設乳怎,下文中出現(xiàn)http均是構建好的HTTP實例(詳細請看前文):

HTTP http = HTTP.builder().build();

OK彩郊,一切就緒,我們接著上篇文章繼續(xù)講蚪缀。

實現(xiàn)生命周期綁定(for Android)

由于 OkHttps 并不依賴于 Android秫逝,所以它并不提供生命周期綁定的直接實現(xiàn),但它的一些擴展機制讓我們很容易就可以實現(xiàn)這個需求询枚。在開始之前违帆,我們首先來理解何為生命周期綁定:

所謂的生命周期綁定:即是讓 HTTP 任務感知其所屬的 Activity 或 Fragment 的生命周期,當 Activity 或 Fragment 將被銷毀時金蜀,框架應自動的把由它們發(fā)起的但尚未完成的 HTTP 任務全部取消刷后,以免導致程序出錯!

現(xiàn)在我們需要對HTTP實例進行配置廉油,配置后的HTTP實例具有生命周期綁定的功能惠险,在ActivityFragment里,它的使用效果如下:

// 在 Activity 或 Fragment 內(nèi)發(fā)起請求
http.async("http://www.baidu.com")
        .bind(getLifecycle())   // 綁定生命周期
        .setOnResponse((HttpResult result) -> {
            Log.i("FirstFragment", "收到請求:" + result.toString());
        })
        .get();

上述代碼中的getLifecycle()ActivityFragment自帶的方法抒线,而bind()HttpTask的現(xiàn)有方法。在配置好HTTP實例后渣慕,上述代碼發(fā)起的請求便可以感知ActivityFragment的生命周期嘶炭。

HTTP實例到底該如何配置呢?

第一步:配置預處理器

HTTP http = HTTP.builder()
        ... // 省略其它配置項
        .addPreprocessor((Preprocessor.PreChain chain) -> {
            HttpTask<?> task = chain.getTask();
            Object bound = task.getBound();
            // 判斷 task 是否綁定了 Lifecycle 對象
            if (bound instanceof Lifecycle) {
                // 重新綁定一個 生命周期監(jiān)視器(LCObserver)對象逊桦,它的定義見下一步
                task.bind(new LCObserver(task, (Lifecycle) bound));
            }
            chain.proceed();
        })
        ... // 省略其它配置項
        .build();

第二步:定義生命周期監(jiān)視器

public class LCObserver implements LifecycleObserver {

    HttpTask<?> task;
    Lifecycle lifecycle;

    LCObserver(HttpTask<?> task, Lifecycle lifecycle) {
        this.task = task;
        this.lifecycle = lifecycle;
        lifecycle.addObserver(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        task.cancel();  // 在 ON_STOP 事件中眨猎,取消對應的 HTTP 任務
    }

    public void unbind() {
        // 在請求完成之后移除監(jiān)視器
        lifecycle.removeObserver(this);
    }

}

第三步:配置全局回調(diào)監(jiān)聽

以上兩步其實已經(jīng)實現(xiàn)了生命周期綁定的功能,但是在請求完成之后强经,我們需要在lifecycle中移除LCObserver對象:

HTTP http = HTTP.builder()
        ... // 省略其它配置項
        .completeListener((HttpTask<?> task, HttpResult.State state) -> {
            Object bound = task.getBound();
            // 判斷 task 是否綁定了生命周期監(jiān)視器(LCObserver)對象
            if (bound instanceof LCObserver) {
                // 解綁監(jiān)視器
                ((LCObserver) bound).unbind();
            }
            return true;
        })
        ... // 省略其它配置項
        .build();

以上三步便在Android中實現(xiàn)了生命周期與HTTP請求綁定的功能

是不是非常簡單呢睡陪,懶得敲代碼的同學還可以 點這里 OkHttps.java 直接下載封裝好的源碼,其中不僅編寫了生命周期綁定的配置,還有在UI線程執(zhí)行回調(diào)的配置兰迫。

有需要的同學信殊,可以直接下載下來使用,還可以基于它再次擴展汁果,比如實現(xiàn)自動添加 TOKEN 的功能涡拘,具體可以參考原文的 6.5 串行預處理器(TOKEN問題最佳解決方案),再比如擴展實現(xiàn)生命周期與下載事件綁定的功能据德,實現(xiàn)起來都非常簡單鳄乏。


如果這個項目還不錯,就到這里點個小星星吧

Gitee:https://gitee.com/ejlchina-zhxu/okhttps
GitHub:https://github.com/ejlchina/okhttps


前篇文章:OkHttp 優(yōu)雅封裝 OkHttps 之 回調(diào)線程魔變

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棘利,一起剝皮案震驚了整個濱河市橱野,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌善玫,老刑警劉巖仲吏,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝌焚,居然都是意外死亡裹唆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門只洒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來许帐,“玉大人,你說我怎么就攤上這事毕谴〕善瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵涝开,是天一觀的道長循帐。 經(jīng)常有香客問我,道長舀武,這世上最難降的妖魔是什么拄养? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮银舱,結(jié)果婚禮上瘪匿,老公的妹妹穿的比我還像新娘。我一直安慰自己寻馏,他們只是感情好棋弥,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诚欠,像睡著了一般顽染。 火紅的嫁衣襯著肌膚如雪漾岳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天粉寞,我揣著相機與錄音尼荆,去河邊找鬼。 笑死仁锯,一個胖子當著我的面吹牛耀找,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播业崖,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼野芒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了双炕?” 一聲冷哼從身側(cè)響起狞悲,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妇斤,沒想到半個月后摇锋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡站超,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年荸恕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片死相。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡融求,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出算撮,到底是詐尸還是另有隱情生宛,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布肮柜,位于F島的核電站陷舅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏审洞。R本人自食惡果不足惜莱睁,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望预明。 院中可真熱鬧缩赛,春花似錦、人聲如沸撰糠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阅酪。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間术辐,已是汗流浹背砚尽。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辉词,地道東北人必孤。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像瑞躺,于是被迫代替她去往敵國和親敷搪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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