OkHttp 優雅封裝 OkHttps 之 回調線程魔變


第一篇:OkHttp 優雅封裝 HttpUtils 之 氣海雪山初探
第二篇:OkHttp 優雅封裝 HttpUtils 之 上傳下載解密

簡介

HttpUtils 從 v2.3.0 之后便重命名了,因為它已不單單是幾個工具類,而是一套具有豐富功能的輕量網絡開發包。更像是 OkHttp 的加強版,所以它的名字是 OkHttps。

中文官網: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 版本調成 1.8,在 app 模塊的 build.gradle 中加入以下配置即可:

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

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

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

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

回調線程自由切換(for Android)

  在 Android 開發中,經常會把某些代碼放到特點的線程去執行,比如網絡請求響應后的頁面更新在主線程(UI線程)執行,而保存文件則在IO線程操作。OkHttps 為這類問題提供了良好的方案。

  在 默認 情況下,所有回調 函數都會 在 IO 線程 執行。為什么會設計如此呢?這是因為 OkHttps 只是純粹的 Java 領域 Http工具包,本身對 Android 不會有任何依賴,因此也不知 Android 的 UI 線程為何物。這么設計也讓它在 Android 之外有更多的可能性。

  但是在 Android 里使用 OkHttps 的話,UI線程的問題能否優雅的解決呢?當然可以!簡單粗暴的方法就是配置一個 回調執行器:

HTTP http = HTTP.builder()
       .callbackExecutor((Runnable run) -> {
           // 實際編碼中可以吧 Handler 提出來,不需要每次執行回調都重新創建
           new Handler(Looper.getMainLooper()).post(run); // 在主線程執行
       })
       .build();

  上述代碼便實現了讓 所有回調函數 都在 主線程(UI線程) 執行的目的,如:

http.async("/users")
        .addBodyParam("name", "Jack")
        .setOnProcess((Process process) -> {
            // 在主線程執行
        })
        .setOnResponse((HttpResult result) -> {
            // 在主線程執行
        })
        .setOnException((Exception e) -> {
            // 在主線程執行
        })
        .setOnComplete((State state) -> {
            // 在主線程執行
        })
        .post();

  但是,如果同時還想讓某些回調放在IO線程,實現 自由切換,怎么辦呢?OkHttps 給出了非常靈活的方法,如下:

http.async("/users")
        .addBodyParam("name", "Jack")
        .setOnProcess((Process process) -> {
            // 在主線程執行
        })
        .nextOnIO()          // 指定下一個回調在 IO 線程執行
        .setOnResponse((HttpResult result) -> {
            // 在 IO 線程執行
        })
        .setOnException((Exception e) -> {
            // 在主線程執行(沒有指明 nextOnIO 則在回調執行器里執行)
        })
        .nextOnIO()          // 指定下一個回調在 IO 線程執行
        .setOnComplete((State state) -> {
            // 在 IO 線程執行
        })
        .post();

  無論是哪一個回調,都可以使用nextOnIO()方法自由切換。同樣,對於文件下載也是一樣:

http.sync("/download/test.zip")
        .get()
        .getBody()
        .setOnProcess((Process process) -> {
            // 在主線程執行
        })
        .toFolder("D:/download/")
        .nextOnIO()          // 指定下一個回調在 IO 線程執行
        .setOnSuccess((File file) -> {
            // 在 IO 線程執行
        })
        .setOnFailure((Failure failure) -> {
            // 在主線程執行
        })
        .start();

怎么樣,是不是很簡單呢?

如果覺得可以,就到這里點個小星星吧:

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


前篇文章:OkHttp 優雅封裝 HttpUtils 之 上傳下載解密
下篇文章:OkHttp 優雅封裝 OkHttps 之 現生命周期綁定,敬請期待!


免責聲明!

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



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