第一篇:OkHttp 優(yōu)雅封裝 OkHttps 之 氣海雪山初探
第二篇:OkHttp 優(yōu)雅封裝 OkHttps 之 上傳下載解密
第三篇:OkHttp 優(yōu)雅封裝 OkHttps 之 回調(diào)線程魔變
簡介
OkHttps 是 OkHttp 的超輕量封裝包科盛。
和 Retrofit 相比,它更加輕量(只有 59Kb)菜皂,是 Retrofit (124Kb)的一半贞绵,而且更加的開箱即用,API 更加自然和語義化恍飘。
OkHttps 用起來很優(yōu)美榨崩,可以鏈式調(diào)用,有點像 RxJava 卻比 RxJava 更簡單章母。
中文官網(wǎng):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 版本調(diào)成 1.8母蛛,在 app 模塊的 build.gradle 中加入以下配置即可:
android {
// 省略其它配置..
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
}
在正式開始之前,我們依然假設乳怎,下文中出現(xiàn)http
均是構建好的HTTP
實例(詳細請看前文):
HTTP http = HTTP.builder().build();
OK彩郊,一切就緒,我們接著上篇文章繼續(xù)講蚪缀。
實現(xiàn)生命周期綁定(for Android)
由于 OkHttps 并不依賴于 Android秫逝,所以它并不提供生命周期綁定的直接實現(xiàn),但它的一些擴展機制讓我們很容易就可以實現(xiàn)這個需求询枚。在開始之前违帆,我們首先來理解何為生命周期綁定:
所謂的生命周期綁定:即是讓 HTTP 任務感知其所屬的 Activity 或 Fragment 的生命周期,當 Activity 或 Fragment 將被銷毀時金蜀,框架應自動的把由它們發(fā)起的但尚未完成的 HTTP 任務全部取消刷后,以免導致程序出錯!
現(xiàn)在我們需要對HTTP
實例進行配置廉油,配置后的HTTP
實例具有生命周期綁定的功能惠险,在Activity
或Fragment
里,它的使用效果如下:
// 在 Activity 或 Fragment 內(nèi)發(fā)起請求
http.async("http://www.baidu.com")
.bind(getLifecycle()) // 綁定生命周期
.setOnResponse((HttpResult result) -> {
Log.i("FirstFragment", "收到請求:" + result.toString());
})
.get();
上述代碼中的getLifecycle()
是Activity
或Fragment
自帶的方法抒线,而bind()
是HttpTask
的現(xiàn)有方法。在配置好HTTP
實例后渣慕,上述代碼發(fā)起的請求便可以感知Activity
或Fragment
的生命周期嘶炭。
那HTTP
實例到底該如何配置呢?
第一步:配置預處理器
HTTP http = HTTP.builder()
... // 省略其它配置項
.addPreprocessor((Preprocessor.PreChain chain) -> {
HttpTask<?> task = chain.getTask();
Object bound = task.getBound();
// 判斷 task 是否綁定了 Lifecycle 對象
if (bound instanceof Lifecycle) {
// 重新綁定一個 生命周期監(jiān)視器(LCObserver)對象逊桦,它的定義見下一步
task.bind(new LCObserver(task, (Lifecycle) bound));
}
chain.proceed();
})
... // 省略其它配置項
.build();
第二步:定義生命周期監(jiān)視器
public class LCObserver implements LifecycleObserver {
HttpTask<?> task;
Lifecycle lifecycle;
LCObserver(HttpTask<?> task, Lifecycle lifecycle) {
this.task = task;
this.lifecycle = lifecycle;
lifecycle.addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
task.cancel(); // 在 ON_STOP 事件中眨猎,取消對應的 HTTP 任務
}
public void unbind() {
// 在請求完成之后移除監(jiān)視器
lifecycle.removeObserver(this);
}
}
第三步:配置全局回調(diào)監(jiān)聽
以上兩步其實已經(jīng)實現(xiàn)了生命周期綁定的功能,但是在請求完成之后强经,我們需要在lifecycle
中移除LCObserver
對象:
HTTP http = HTTP.builder()
... // 省略其它配置項
.completeListener((HttpTask<?> task, HttpResult.State state) -> {
Object bound = task.getBound();
// 判斷 task 是否綁定了生命周期監(jiān)視器(LCObserver)對象
if (bound instanceof LCObserver) {
// 解綁監(jiān)視器
((LCObserver) bound).unbind();
}
return true;
})
... // 省略其它配置項
.build();
以上三步便在Android中實現(xiàn)了生命周期與HTTP請求綁定的功能
是不是非常簡單呢睡陪,懶得敲代碼的同學還可以 點這里 OkHttps.java 直接下載封裝好的源碼,其中不僅編寫了生命周期綁定的配置,還有在UI線程執(zhí)行回調(diào)的配置兰迫。
有需要的同學信殊,可以直接下載下來使用,還可以基于它再次擴展汁果,比如實現(xiàn)自動添加 TOKEN 的功能涡拘,具體可以參考原文的 6.5 串行預處理器(TOKEN問題最佳解決方案),再比如擴展實現(xiàn)生命周期與下載事件綁定的功能据德,實現(xiàn)起來都非常簡單鳄乏。
如果這個項目還不錯,就到這里點個小星星吧
Gitee:https://gitee.com/ejlchina-zhxu/okhttps
GitHub:https://github.com/ejlchina/okhttps