android 封装回调,OkHttp 优雅封装 OkHttps 之 回调线程魔变
简介
HttpUtils 从 v2.3.0 之后便重命名了,因为它已不单单是几个工具类,而是一套具有丰富功能的轻量网络开发包。更像是 OkHttp 的加强版,所以它的名字是 OkHttps。
安装教程
Maven
com.ejlchina
okhttps
1.0.4
复制代码
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();
复制代码
怎么样,是不是很简单呢?
如果觉得可以,就到这里点个小星星吧:
android 封装回调,OkHttp 优雅封装 OkHttps 之 回调线程魔变相关推荐
- Android中使用封装的OKHttp上传图片,从相机和相册中获取图片并剪切
Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切 效果: 注意: 1:网络权限 <uses-permission android:name="android.pe ...
- OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3
OkHttp协议 okhttp是一个第三方类库,用于android中请求网络 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCan ...
- Android Tencent X5 WebView 集成封装
Android Tencent X5 WebView 集成封装 Cookie管理.进度监听.适配8.1系统等策略 这篇文章的目标就是怎么样快速封装X5WebView,如何有效的同步以及管理Cookie ...
- Android架构篇-3 网络接口封装
Android架构篇-3 网络接口封装 实现功能: 1.暴露参数请求地址url.请求方法method.请求参数params.请求头header.请求响应response.https请求证书 2.支持g ...
- RecyclerView Adapter 优雅封装搞定所有列表
转载自: 依然范特稀西 RecycleView加载列表,封装Adapter,快速高效的添加一个列表(包括单 Item 列表和多item列表). 理念 1, 构造一个通用的Adapter模版,避免每添加 ...
- OkHttp完美封装,一行搞完外部请求
OkHttp完美封装,一行搞完外部请求 OKHttpUtil 在Java的世界中,Http客户端之前一直是Apache家的HttpClient占据主导,但是由于此包较为庞大,API又比较难用,因此并不 ...
- 社会化登录分享-Android SDK的二次封装和使用
本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...
- Android开发之SharedPreferences的封装
对于大部分初学者来说,如果想利用SharedPreferences进行数据存储的话大部分人(包括本人)应该会这样: 存储: SharedPreferences sharedPreferences = ...
- Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性)
Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性) 1 效果 2 BaseHolder的封装 public class BaseViewH ...
- Android 图片处理工具类封装2
http://www.2cto.com/kf/201312/263638.html Android 图片处理工具类封装 2013-12-10 0个评论 来源:Wiker Yong 的专栏 ...
最新文章
- sql优化的方法及思路_合理的sql优化思路--如何缩短SQL调优时间?
- java 7 jboss_JBoss7 入门指南
- Git 的安装和创建版本库 。
- React 的 Hello World
- 【英语学习】【English L06】U06 Banking L2 A savings account sounds better for me
- uniapp app蓝牙打印_编程器加装蓝牙串口模块与手机APP操作演示
- linux 查看系统内存及系统负载
- 在windows 2003系统上安装诺基亚pc套件的方法
- Scratch的广播与消息
- 全网显示 IP 归属地,这背后的技术你知道吗?
- 贝叶斯判别分析,Python代码分类讲解
- java 熄灯问题_C++基础算法学习——熄灯问题
- 使用 字蛛 对ttf字体文件进行压缩
- 如何学会做一名优秀的下属
- 【java校招你不知道的那些事儿】java校招有没有考点大纲?不能拿面试补缺
- Android手机直播(一)总览
- 苹果手机隐私分析数据是什么_苹果和谷歌可能是我们在隐私操作系统上的最佳选择...
- warning: unused variable ‘D‘ [-Wunused-variable]|
- SpringCloud学习笔记(十) Bus 消息总线
- 数理逻辑蕴含_数理逻辑为什么犯傻?
热门文章
- spark rdd详解二(transformation与action操作)
- 4台服务器集群搭建_Redis Cluster高可用集群搭建
- 可变车道怎么走不违章_还记得这种车道怎么走吗?
- 快速掌握用python写并行程序_自己python程序的并行修改
- html5 显示圆形图片,《小白HTML5成长之路40》怎样显示圆角图片
- 假设检验_关于假设检验与P值的几点看法
- RocketMQ 源码之 异步和同步请求 以及异步的回调 是怎么做到的
- 使用fileupload实现文件上传
- 《程序是怎样跑起来的》第十一章读后感
- pycharm中同时注释多行代码