OkHttps 實現(xiàn)線程自由切換(for Android)

2020-04-29 09:36 更新

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

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

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

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

  上述代碼便實現(xiàn)了讓 所有回調(diào)函數(shù) 都在 主線程(UI線程) 執(zhí)行的目的,如:

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

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

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

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

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

如果覺得 OkHttps 好用,就去點個 Star 吧,項目地址:


官方網(wǎng)站:http://okhttps.ejlchina.com/

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號