OkHttpUtils 下载上传文件

2023-11-16

目录

一、使用时需要先添加依赖(build.gradle文件中):

二、使用注意事项

三、OkHttpUtils 目前支持

3.1 统一的文件下载管理(DownloadManager):

3.2 统一的文件上传管理(UploadManager)

四、用法

4.1 方法说明

4.2 请求文件下载

4.3 普通Post,直接上传String类型的文本

4.4.普通Post,直接上传Json类型的文本

五、请求功能的所有配置讲解

六、取消请求

封装了okhttp的网络框架,支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持Https和自签名证书,支持cookie自动管理,支持四种缓存模式缓存网络数据,支持301、302重定向,扩展了统一的上传管理和下载管理功能

一、使用时需要先添加依赖(build.gradle文件中):

    compile 'com.lzy.net:okhttputils:1.8.0'  //可以单独使用,不需要依赖下方的扩展包
    compile 'com.lzy.net:okhttpserver:1.0.2' //扩展了下载管理和上传管理,根据需要添加
 
    或者
 
    compile 'com.lzy.net:okhttputils:+'  //版本号使用 + 可以自动引用最新版
    compile 'com.lzy.net:okhttpserver:+' //版本号使用 + 可以自动引用最新版

二、使用注意事项

  • okhttputils使用的okhttp的版本是最新的 3.4.1 版本,和以前的 2.x 的版本可能会存在冲突。
  • okhttpserver是对okhttputils的扩展,统一了下载管理和上传管理,对项目有需要做统一下载的可以考虑使用该扩展,不需要的可以直接使用okhttputils即可。
  • 对于缓存模式使用,需要与返回对象相关的所有javaBean必须实现Serializable接口,否者会报NotSerializableException
  • 使用缓存时,如果不指定cacheKey,默认是用url带参数的全路径名为cacheKey
  • 使用该网络框架时,必须要在 Application 中做初始化 OkHttpUtils.init(this)。

三、OkHttpUtils 目前支持

  • 一般的 get,post,put,delete,head,options请求
  • 基于Post的大文本数据上传
  • 多文件和多参数统一的表单上传
  • 支持一个key上传一个文件,也可以一个Key上传多个文件
  • 大文件下载和下载进度回调
  • 大文件上传和上传进度回调
  • 支持cookie的内存存储和持久化存储,支持传递自定义cookie
  • 支持304缓存协议,扩展四种本地缓存模式,并且支持缓存时间控制
  • 支持301、302重定向
  • 支持链式调用
  • 支持可信证书和自签名证书的https的访问,支持双向认证
  • 支持根据Tag取消请求
  • 支持自定义泛型Callback,自动根据泛型返回对象

3.1 统一的文件下载管理(DownloadManager):

  • 结合OkHttpUtils的request进行网络请求,支持与OkHttpUtils保持相同的全局公共参数,同时支持请求传递参数
  • 支持 断点下载,支持突然断网,强杀进程后,断点依然有效
  • 支持 下载 暂停 等待 停止 出错 完成 六种下载状态
  • 所有下载任务按照taskKey区分,切记不同的任务必须使用不一样的key,否者断点会发生覆盖
  • 相同的下载url地址如果使用不一样的taskKey,也会认为是两个下载任务
  • 默认同时下载数量为3个,默认下载路径/storage/emulated/0/download,下载路径和下载数量都可以在代码中配置
  • 下载文件名可以自己定义,也可以不传,框架自动解析响应头或者url地址获得文件名,如果都没获取到,使用default作为文件名
  • 下载管理使用了服务提高线程优先级,避免后台下载时被系统回收

3.2 统一的文件上传管理(UploadManager)

  • 结合OkHttpUtils的request进行网络请求,支持与OkHttpUtils保持相同的全局公共参数,同时支持请求传递参数
  • 上传只能使用PostPutDeleteOptions 这四种请求,不支持GetHead
  • 该上传管理为简单管理,不支持断点续传或分片上传,只是简单的将所有上传任务使用线程池进行了统一管理
  • 默认同时上传数量为1个,该数列可以在代码中配置修改

四、用法

4.1 方法说明

callback一共有以下 10 个回调,除onSuccess必须实现以外,其余均可以按需实现,每个方法参数详细说明:

  • parseNetworkResponse():解析网络返回的数据回调
  • parseNetworkFail():解析网络失败的数据回调
  • onBefore():网络请求真正执行前回调
  • onSuccess():网络请求成功的回调
  • onCacheSuccess():缓存读取成功的回调
  • onError():网络请求失败的回调
  • onCacheError():网络缓存读取失败的回调
  • onAfter():网络请求结束的回调,无论成功失败一定会执行
  • upProgress():上传进度的回调
  • downloadProgress():下载进度的回调

4.2 请求文件下载

OkHttpUtils.get(Urls.URL_DOWNLOAD)//
    .tag(this)//
    .execute(new FileCallback("file.jpg") {  //文件下载时,需要指定下载的文件目录和文件名
        @Override
        public void onSuccess(File file, Call call, Response response) {
            // file 即为文件数据,文件保存在指定目录
        }
 
        @Override
        public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
            //这里回调下载进度(该回调在主线程,可以直接更新ui)
        }
    });

4.3 普通Post,直接上传String类型的文本

一般此种用法用于与服务器约定的数据格式,当使用该方法时,params中的参数设置是无效的,所有参数均需要通过需要上传的文本中指定,此外,额外指定的header参数仍然保持有效。

OkHttpUtils.post(Urls.URL_TEXT_UPLOAD)//
    .tag(this)//
    .upString("这是要上传的长文本数据!")//
    .execute(new StringCallback() {
        @Override
        public void onSuccess(String s, Call call, Response response) {
            //上传成功
        }
 
        @Override
        public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
            //这里回调上传进度(该回调在主线程,可以直接更新ui)
        }
    });

4.4.普通Post,直接上传Json类型的文本

该方法与postString没有本质区别,只是数据格式是json,一般来说,需要自己创建一个实体bean或者一个map,把需要的参数设置进去,然后通过三方的Gson或者fastjson转换成json字符串,最后直接使用该方法提交到服务器。

HashMap<String, String> params = new HashMap<>();
params.put("key1", "value");
params.put("key2", "随便写1");
params.put("key3", "随便写2");
params.put("key4", "随便写3");
JSONObject jsonObject = new JSONObject(params);
 
OkHttpUtils.post(Urls.URL_TEXT_UPLOAD)//
    .tag(this)//
    .upJson(jsonObject.toString())//
    .execute(new StringCallback() {
        @Override
        public void onSuccess(String s, Call call, Response response) {
            //上传成功
        }
 
        @Override
        public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
            //这里回调上传进度(该回调在主线程,可以直接更新ui)
        }
    });

五、请求功能的所有配置讲解

以下代码包含了以下内容:

  • 一次普通请求所有能配置的参数,真实使用时不需要配置这么多,按自己的需要选择性的使用即可
  • 多文件和多参数的表单上传,同时支持进度监听
  • 自签名网站https的访问,调用setCertificates方法即可
  • 为单个请求设置超时,比如涉及到文件的需要设置读写等待时间多一点。
  • Cookie一般情况下只需要在初始化的时候调用setCookieStore即可实现cookie的自动管理,如果特殊业务需要,需要手动额外向服务器传递自定义的cookie,可以在每次请求的时候调用addCookie方法,该方法提供了3个重载形式,可以根据自己的需要选择使用。
OkHttpUtils.get(Urls.URL_METHOD) // 请求方式和请求url, get请求不需要拼接参数,支持get,post,put,delete,head,options请求
    .tag(this)               // 请求的 tag, 主要用于取消对应的请求
    .connTimeOut(10000)      // 设置当前请求的连接超时时间
    .readTimeOut(10000)      // 设置当前请求的读取超时时间
    .writeTimeOut(10000)     // 设置当前请求的写入超时时间
    .cacheKey("cacheKey")    // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
    .cacheTime(5000)         // 缓存的过期时间,单位毫秒
    .cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST) // 缓存模式,详细请看第四部分,缓存介绍
    .setCertificates(getAssets().open("srca.cer")) // 自签名https的证书,可变参数,可以设置多个
    .addInterceptor(interceptor)            // 添加自定义拦截器
    .headers("header1", "headerValue1")     // 添加请求头参数
    .headers("header2", "headerValue2")     // 支持多请求头参数同时添加
    .params("param1", "paramValue1")        // 添加请求参数
    .params("param2", "paramValue2")        // 支持多请求参数同时添加
    .params("file1", new File("filepath1")) // 可以添加文件上传
    .params("file2", new File("filepath2")) // 支持多文件同时添加上传
    .addUrlParams("key", List<String> values) //这里支持一个key传多个参数
    .addFileParams("key", List<File> files) //这里支持一个key传多个文件
    .addFileWrapperParams("key", List<HttpParams.FileWrapper> fileWrappers)//这里支持一个key传多个文件
    .addCookie("aaa", "bbb")    // 这里可以传递自己想传的Cookie
    .addCookie(cookie)          // 可以自己构建cookie
    .addCookies(cookies)        // 可以一次传递批量的cookie
     //这里给出的泛型为 ServerModel,同时传递一个泛型的 class对象,即可自动将数据结果转成对象返回
    .execute(new DialogCallback<ServerModel>(this, ServerModel.class) {
        @Override
        public void onBefore(BaseRequest request) {
            // UI线程 请求网络之前调用
            // 可以显示对话框,添加/修改/移除 请求参数
        }
 
        @Override
        public ServerModel parseNetworkResponse(Response response) throws Exception{
            // 子线程,可以做耗时操作
            // 根据传递进来的 response 对象,把数据解析成需要的 ServerModel 类型并返回
            // 可以根据自己的需要,抛出异常,在onError中处理
            return null;
        }
 
        @Override
        public void parseNetworkFail(Call call, IOException e) {
            // 子线程,可以做耗时操作
            // 用于网络错误时在子线程中执行数据耗时操作,子类可以根据自己的需要重写此方法
        }
 
        @Override
        public void onSuccess(ServerModel serverModel, Call call, Response response) {
            // UI 线程,请求成功后回调
            // ServerModel 返回泛型约定的实体类型参数
            // call        本次网络的请求信息,如果需要查看请求头或请求参数可以从此对象获取
            // response    本次网络访问的结果对象,包含了响应头,响应码等
        }
 
        @Override
        public void onCacheSuccess(ServerModel serverModel, Call call) {
            // UI 线程,缓存读取成功后回调
            // serverModel 返回泛型约定的实体类型参数
            // call        本次网络的请求信息
        }
 
        @Override
        public void onError(Call call, Response response, Exception e) {
            // UI 线程,请求失败后回调
            // call        本次网络的请求对象,可以根据该对象拿到 request
            // response    本次网络访问的结果对象,包含了响应头,响应码等
            // e           本次网络访问的异常信息,如果服务器内部发生了错误,响应码为 404,或大于等于500
        }
 
        @Override
        public void onCacheError(Call call, Exception e) {
            // UI 线程,读取缓存失败后回调
            // call        本次网络的请求对象,可以根据该对象拿到 request
            // e           本次网络访问的异常信息,如果服务器内部发生了错误,响应码为 404,或大于等于500
        }
 
        @Override
        public void onAfter(ServerModel serverModel, Exception e) {
            // UI 线程,请求结束后回调,无论网络请求成功还是失败,都会调用,可以用于关闭显示对话框
            // ServerModel 返回泛型约定的实体类型参数,如果网络请求失败,该对象为 null
            // e           本次网络访问的异常信息,如果服务器内部发生了错误,响应码为 404,或大于等于500
        }
 
        @Override
        public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
            // UI 线程,文件上传过程中回调,只有请求方式包含请求体才回调(GET,HEAD不会回调)
            // currentSize  当前上传的大小(单位字节)
            // totalSize   需要上传的总大小(单位字节)
            // progress     当前上传的进度,范围 0.0f ~ 1.0f
            // networkSpeed 当前上传的网速(单位秒)
        }
 
        @Override
        public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
            // UI 线程,文件下载过程中回调
            //参数含义同 上传相同
        }
    });

六、取消请求

每个请求前都设置了一个参数tag,取消则通过OkHttpUtils.cancel(tag)执行。 例如:在Activity中,当Activity销毁取消请求,可以在onDestory里面统一取消。

    @Override
    protected void onDestroy() {
        super.onDestroy();
 
        //根据 Tag 取消请求
        OkHttpUtils.getInstance().cancelTag(this);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OkHttpUtils 下载上传文件 的相关文章

随机推荐

  • Shell的read 读取控制台输入、read的使用

    文章目录 1 read 读取控制台输入 1 1基本语法 1 2read的使用 如果想看更详细的Shell总结请到我之前写的博客https blog csdn net Redamancy06 article details 126048299
  • com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 2-byte

    com sun org apache xerces internal impl io MalformedByteSequenceException Invalid byte 2 of 2 byte UTF 8 sequence 分析 这个问
  • YOLO-----关于正负样本、Loss、IOU、怎样去平衡正负样本的问题?

    关于正负样本 Loss IOU 怎样去平衡正负样本的问题 1 关于正负样本 2 Loss计算 3 IOU GIOU DIOU CIOU 4 怎样去平衡正负样本的问题 先整理一下anchor的概念 常用的anchor定义 Faster R C
  • MySQL 8 安装教程

    MySQL 8发布了 据说相比MySQL 5速度提升了2倍 今天来搞一搞MySQL 8 一 下载MySQL 8 1 首先当然是下载安装包了 下载地址 点击下载MySQL 8 这个页面相信大家都熟悉 我就不多说了 2 将下载的压缩包解压 解压
  • 全网最简洁的mpy-cross教程

    大家知道我一向精干 不喜欢搞花儿的 如果去mpy官网看mpy cross的相关资料 估计又得绕蒙 跟我来 保证你三分钟学会 但是本文不涉及原理 第一 mpy cross是干嘛滴 答 把py文件转成mpy系统读的mpy文件 术语咱不懂 叫交叉
  • H3C交换机如何配置SNMP协议?

    1 使用telnet 登陆设备 system view snmp agent snmp agent community read public snmp agent sys infoversion all dis cur save 保存 Y
  • 操作系统原理大题

    一 地址变换和求FAT表大小 某一页表内容自0 7依次为03 07 0B 11 1A 1D 20 22 请计算页面大小为1K和4K时的逻辑地址134D对应的物理地址 首先 将134D转换为二进制数为 0001001101001101 1k为
  • 【2024届校招内推:NTAA84y】腾讯云智研发中心

    云智校招新官网查看最新岗位情况 云智研发中心2024届校园招聘官网 内推码 NTAA84y 云智研发公司2024届校园招聘启动啦 腾讯旗下子公司 八大类岗位 五大城市全面开放 在喜欢的城市 做喜欢的工作 期待正能量 共担当 实干家的你加入云
  • dumpsys meminfo 的原理和应用

    什么是dumpsys meminfo Android中通过命令dumpsys meminfo package name pid 查看指定进程的内存使用情况 通过输出的信息 可以看出来应用在内存哪里分配出现了问题 比如native heap
  • 华为服务器sn号查询网站,linux 查询服务器sn

    linux 查询服务器sn 内容精选 换一换 Linux云服务器变更规格时 可能会发生磁盘挂载失败的情况 因此 变更规格后 需检查磁盘挂载状态是否正常 本节操作介绍变更规格后检查磁盘挂载状态的操作步骤 以root用户登录云服务器 执行以下命
  • top 命令

    NAME top display Linux tasks SYNOPSIS top hv abcHimMsS d delay n iterations p pid pid a 按内存使用排序 b 批处理 c 显示完整的命令 d 指定间隔时间
  • 文章目录 定义 抽象类型定义 存储结构 顺序存储 定长顺序存储结构 堆式顺序存储结构 链式存储 串的链式存储结构 定义 串是一种内容受限的线性表 串 字符串 由零个或多个字符组成的有限序列 子串 串的任意个连续的字符组成的子序列 主串 包含
  • 深度学习部署--tensorflow 用c++调用前向

    使用TensorFlow C API构建线上预测服务 第一篇 Oct 9 2017 tensorflow 文章目录 1 使用Python接口训练模型 2 源码编译TensorFlow 3 使用TensorFlow C API编写预测代码 3
  • 线下零售场景的消费者商品场景终端数字升级

    按照识别的精度排序 确实是虹膜 指纹 人脸的识别精度依次降低 但人脸识别可以根据摄像头的提升而提升 双目摄像头 结构光摄像头 TOF等等 这个上升空间很大 从应用性来看 你现在让所有的用户都去提取虹膜信息 指纹信息 这个很难 不现实 而我们
  • 微信小游戏 can't find variable: window

    最近测试微信小游戏的时候 需要加入一些SDK代码 在加入这些文件到项目并require相应的库的时候 小游戏开发者工具一直报错 can t find variable window 查找了相关资料 https developers weix
  • 逐点插入法实现 Delaunary三角网 ( 附 C++ 代码)

    逐点插入法作为一种经典的凸闭包收缩算法 其思想是 首先找到包含数据区域的最小凸包边形 并从该多边形开始从外到内形成Delaunary三角网 因此其每次插入一个新的点就会删除相应的三角形来构建性的三角网 这个过程中常常伴随着大量的查询计算过程
  • flutter 从A到B,然后在从B返回A页面,A页面刷新数据

    flutter 从A到B 然后在从B返回A页面 A页面刷新数据实现代码如下 Navigator push context MaterialPageRoute builder context gt NoticePage then value
  • 解决java.lang.IllegalArgumentException: Could not resolve placeholder xx.xx.addr 的问题,思路:一定是配置文件问题

    今天启动SpringBoot遇到一个问题 提示 java lang IllegalArgumentException Could not resolve placeholder xx xx addr in value xx xx addr
  • pytorch源码解读——RNN/LSTM篇

    文章的字母中 b batch size t time step n num feature h hidden size 假设输入数据维度input b t n 所设计的LSTM模型如下 class MYLSTM nn Module def
  • OkHttpUtils 下载上传文件

    目录 一 使用时需要先添加依赖 build gradle文件中 二 使用注意事项 三 OkHttpUtils 目前支持 3 1 统一的文件下载管理 DownloadManager 3 2 统一的文件上传管理 UploadManager 四