Android 中 OkHttp 三步實現生命周期綁定


簡介

OkHttps 是 OkHttp 增強版的超輕量封裝包。

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

OkHttps 用起來很優美,可以鏈式調用,有點像 RxJava 卻比 RxJava 更簡單。

中文官網: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.5</version>
</dependency>

Gradle

implementation 'com.ejlchina:okhttps:1.0.5'

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

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

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

  由於 OkHttps 並不依賴於 Android,所以它並不提供生命周期綁定的直接實現,但它的一些擴展機制讓我們很容易就可以實現這個需求。在開始之前,我們首先來理解何為生命周期綁定:

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

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

// 在 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的生命周期。

  那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 之 回調線程魔變


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM