簡介
OkHttps 是 OkHttp 增強版的超輕量封裝包。
和 Retrofit 相比,它更加輕量(只有 59Kb),是 Retrofit (124Kb)的一半,而且更加的開箱即用,API 更加自然和語義化。
OkHttps 用起來很優美,可以鏈式調用,有點像 RxJava 卻比 RxJava 更簡單。
中文官網: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.5</version>
</dependency>
Gradle
implementation 'com.ejlchina:okhttps:1.0.5'
安卓中使用需要把 JDK 版本調成 1.8,在 app 模塊的 build.gradle 中加入以下配置即可:
android {
// 省略其它配置..
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
}
實現生命周期綁定(for Android)
由於 OkHttps 並不依賴於 Android,所以它並不提供生命周期綁定的直接實現,但它的一些擴展機制讓我們很容易就可以實現這個需求。在開始之前,我們首先來理解何為生命周期綁定:
所謂的生命周期綁定:即是讓 HTTP 任務感知其所屬的 Activity 或 Fragment 的生命周期,當 Activity 或 Fragment 將被銷毀時,框架應自動的把由它們發起的但尚未完成的 HTTP 任務全部取消,以免導致程序出錯!
現在我們需要對HTTP
實例進行配置,配置后的HTTP
實例具有生命周期綁定的功能,在Activity
或Fragment
里,它的使用效果如下:
// 在 Activity 或 Fragment 內發起請求
http.async("http://www.baidu.com")
.bind(getLifecycle()) // 綁定生命周期
.setOnResponse((HttpResult result) -> {
Log.i("FirstFragment", "收到請求:" + result.toString());
})
.get();
上述代碼中的getLifecycle()
是Activity
或Fragment
自帶的方法,而bind()
是HttpTask
的現有方法。在配置好HTTP
實例后,上述代碼發起的請求便可以感知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) {
// 重新綁定一個 生命周期監視器(LCObserver)對象,它的定義見下一步
task.bind(new LCObserver(task, (Lifecycle) bound));
}
chain.proceed();
})
... // 省略其它配置項
.build();
第二步:定義生命周期監視器
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() {
// 在請求完成之后移除監視器
lifecycle.removeObserver(this);
}
}
第三步:配置全局回調監聽
以上兩步其實已經實現了生命周期綁定的功能,但是在請求完成之后,我們需要在lifecycle
中移除LCObserver
對象:
HTTP http = HTTP.builder()
... // 省略其它配置項
.completeListener((HttpTask<?> task, HttpResult.State state) -> {
Object bound = task.getBound();
// 判斷 task 是否綁定了生命周期監視器(LCObserver)對象
if (bound instanceof LCObserver) {
// 解綁監視器
((LCObserver) bound).unbind();
}
return true;
})
... // 省略其它配置項
.build();
以上三步便在Android中實現了生命周期與HTTP請求綁定的功能
是不是非常簡單呢,懶得敲代碼的同學還可以 點這里 OkHttps.java 直接下載封裝好的源碼,其中不僅編寫了生命周期綁定的配置,還有在UI線程執行回調的配置。
有需要的同學,可以直接下載下來使用,還可以基於它再次擴展,比如實現自動添加 TOKEN 的功能,具體可以參考原文的 6.5 串行預處理器(TOKEN問題最佳解決方案),再比如擴展實現生命周期與下載事件綁定的功能,實現起來都非常簡單。
如果這個項目還不錯,就到這里點個小星星吧