OkHttp 优雅封装 OkHttps 之 回调线程魔变
第一篇: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 之 现生命周期绑定,敬请期待!
最新文章
- 理解浏览器历史记录(2)-hashchange、pushState
- [Data Structure &; Algorithm] 八大排序算法
- Sql Server分割字符串函数
- OpenCV的数据类型---Cv
- win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案
- 深入理解js——函数和对象的关系
- Z/OS遇到的错误
- poj 3625 Building Roads
- python中 “与,或,异或”
- JQuery 点击控件获取当前坐标时不兼容IE7
- 初探 iOS8 中的 Size Class
- Python 第十三篇之二:jQuery基础
- HDU:3368-Reversi(暴力枚举)
- angularjs bind与model配合双向绑定 表达式方法输出
- Activity简单几步支持向右滑动返回
- Go语言中的Iota
- 隐马尔可夫模型(HMM)及Viterbi算法
- 【BZOJ 1701】Cow School(斜率优化/动态凸包/分治优化)
- 【MOOC EXP】Linux内核分析实验七报告
- SQL Server 常用函数使用方法(持续更新)
热门文章
- IOS(苹果手机)使用video播放HLS流,实现在内部播放及全屏播放(即非全屏和全屏播放)。
- Ubuntu在Anaconda中安装TensorFlow GPU,Keras,Pytorch
- [vijos1234]口袋的天空<;最小生成树>;
- Java线程及其实现方式
- E - 不爱学习的lyb HDU - 1789(贪心策略)
- 接口测试彻底弄懂Session、Cookie、Token的区别及联系hold住面试官--hold住了开3万,hold不住开3K!
- Java 混淆器
- 写给程序员的机器学习入门 (二) - pytorch 与矩阵计算入门
- 基于Websocket开发的仿微信聊天室
- javascript中的constructor