第一篇:OkHttp 优雅封装 OkHttps 之 气海雪山初探
第二篇:OkHttp 优雅封装 OkHttps 之 上传下载解密
第三篇:OkHttp 优雅封装 OkHttps 之 回调线程魔变
OkHttps 是 OkHttp 的轻量封装包。和 Retrofit 相比,它更加的开箱即用,并且 API 更加自然和语义化。它用起来很优美,有点像 RxJava 却比 RxJava 更简单。
项目地址
Gitee:https://gitee.com/ejlchina-zhxu/okhttps
GitHub:https://github.com/ejlchina/okhttps
<dependency> <groupId>com.ejlchina</groupId> <artifactId>okhttps</artifactId> <version>1.0.4</version> </dependency>
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("https://api.demo.com") .build();
OK,一切就绪,我们接着上篇文章继续讲。
由于 OkHttps 并不依赖于 Android,所以它并不提供生命周期绑定的直接实现,但它的一些扩展机制让我们很容易就可以实现这个需求。在开始之前,我们首先来理解何为生命周期绑定:
所谓的生命周期绑定:即是让 HTTP 任务感知其所属的 Activity 或 Fragment 的生命周期,当 Activity 或 Fragment 将被销毁时,框架应自动的把由它们发起的但尚未完成的 HTTP 任务全部取消,以免导致程序出错!
现在我们需要对HTTP
实例进行配置,配置后的HTTP
实例具有生命周期绑定的功能,在Activity
或Fragment
里,它的使用效果如下:
// 在 Activity 或 Fragment 内发起请求 http.async("https://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问题最佳解决方案),再比如扩展实现生命周期与下载事件绑定的功能,实现起来都非常简单。
如果这个项目还不错,就到这里点个小星星吧
Gitee:https://gitee.com/ejlchina-zhxu/okhttps
GitHub:https://github.com/ejlchina/okhttps
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算