在 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 吧,項目地址:
更多建議: