第一篇:OkHttp 優雅封裝 OkHttps 之 氣海雪山初探
第二篇:OkHttp 優雅封裝 OkHttps 之 上傳下載解密
第三篇:OkHttp 優雅封裝 OkHttps 之 回調線程魔變
java
簡介
OkHttps 是 OkHttp 的輕量封裝包。和 Retrofit 相比,它更加的開箱即用,而且 API 更加天然和語義化。它用起來很優美,有點像 RxJava 卻比 RxJava 更簡單。android
項目地址
Gitee:https://gitee.com/ejlchina-zhxu/okhttps
GitHub:https://github.com/ejlchina/okhttps
git
起步
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 中加入如下配置便可:github
android { // 省略其它配置.. compileOptions { sourceCompatibility = 1.8 targetCompatibility = 1.8 } }
在正式開始以前,咱們依然假設,下文中出現http
均是在構建時設置了BaseUrl
的HTTP
實例(詳細請看前文):api
HTTP http = HTTP.builder() .baseUrl("http://api.demo.com") .build();
OK,一切就緒,咱們接着上篇文章繼續講。app
實現生命週期綁定(for Android)
因爲 OkHttps 並不依賴於 Android,因此它並不提供生命週期綁定的直接實現,但它的一些擴展機制讓咱們很容易就能夠實現這個需求。在開始以前,咱們首先來理解何爲生命週期綁定:框架
所謂的生命週期綁定:便是讓 HTTP 任務感知其所屬的 Activity 或 Fragment 的生命週期,當 Activity 或 Fragment 將被銷燬時,框架應自動的把由它們發起的但還沒有完成的 HTTP 任務所有取消,以避免致使程序出錯!async
如今咱們須要對HTTP
實例進行配置,配置後的HTTP
實例具備生命週期綁定的功能,在Activity
或Fragment
裏,它的使用效果以下:gradle
// 在 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
的生命週期。ui
那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問題最佳解決方案),再好比擴展實現生命週期與下載事件綁定的功能,實現起來都很是簡單。
若是這個項目還不錯,就到這裏點個小星星吧
Gitee:https://gitee.com/ejlchina-zhxu/okhttps
GitHub:https://github.com/ejlchina/okhttps