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

2020-04-29 09:36 更新

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

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

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

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

  上述代碼便實(shí)現(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();

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

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

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

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

如果覺得 OkHttps 好用,就去點(diǎn)個(gè) Star 吧,項(xiàng)目地址:


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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)