OkHttps 三步實現 生命週期綁定

第一篇:OkHttp 優雅封裝 OkHttps 之 氣海雪山初探
第二篇:OkHttp 優雅封裝 OkHttps 之 上傳下載解密
第三篇:OkHttp 優雅封裝 OkHttps 之 回調線程魔變

java

簡介

OkHttps 是 OkHttp 的輕量封裝包。和 Retrofit 相比,它更加的開箱即用,而且 API 更加天然和語義化。它用起來很優美,有點像 RxJava 卻比 RxJava 更簡單。android

項目地址
Gitee:https://gitee.com/ejlchina-zhxu/okhttps
GitHub:https://github.com/ejlchina/okhttps

git

起步

Maven

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

Gradle

implementation 'com.ejlchina:okhttps:1.0.4'

安卓中使用須要把 JDK 版本調成 1.8,在 app 模塊的 build.gradle 中加入如下配置便可:github

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

在正式開始以前,咱們依然假設,下文中出現http均是在構建時設置了BaseUrlHTTP實例(詳細請看前文):api

HTTP http = HTTP.builder()
        .baseUrl("http://api.demo.com")
        .build();

OK,一切就緒,咱們接着上篇文章繼續講。app

實現生命週期綁定(for Android)

因爲 OkHttps 並不依賴於 Android,因此它並不提供生命週期綁定的直接實現,但它的一些擴展機制讓咱們很容易就能夠實現這個需求。在開始以前,咱們首先來理解何爲生命週期綁定:框架

所謂的生命週期綁定:便是讓 HTTP 任務感知其所屬的 Activity 或 Fragment 的生命週期,當 Activity 或 Fragment 將被銷燬時,框架應自動的把由它們發起的但還沒有完成的 HTTP 任務所有取消,以避免致使程序出錯!async

如今咱們須要對HTTP實例進行配置,配置後的HTTP實例具備生命週期綁定的功能,在ActivityFragment裏,它的使用效果以下:gradle

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

上述代碼中的getLifecycle()ActivityFragment自帶的方法,而bind()HttpTask的現有方法。在配置好HTTP實例後,上述代碼發起的請求即可以感知ActivityFragment的生命週期。ui

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

第一步:配置預處理器

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

第二步:定義生命週期監視器

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() {
        // 在請求完成以後移除監視器
        lifecycle.removeObserver(this);
    }

}

第三步:配置全局回調監聽

以上兩步其實已經實現了生命週期綁定的功能,可是在請求完成以後,咱們須要在lifecycle中移除LCObserver對象:

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

以上三步便在Android中實現了生命週期與HTTP請求綁定的功能

是否是很是簡單呢,懶得敲代碼的同窗還能夠 點這裏 OkHttps.java 直接下載封裝好的源碼,其中不只編寫了生命週期綁定的配置,還有在UI線程執行回調的配置。

有須要的同窗,能夠直接下載下來使用,還能夠基於它再次擴展,好比實現自動添加 TOKEN 的功能,具體能夠參考原文的 6.5 串行預處理器(TOKEN問題最佳解決方案),再好比擴展實現生命週期與下載事件綁定的功能,實現起來都很是簡單。


若是這個項目還不錯,就到這裏點個小星星吧

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


前篇文章:OkHttp 優雅封裝 OkHttps 之 回調線程魔變

相關文章
相關標籤/搜索