第一篇: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均是在構建時設置了BaseUrl的HTTP實例(詳細請看前文):
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 之 現生命周期綁定,敬請期待!
