【Android开发】使用OkHttp3下载文件(支持直接下载 / 支持断点续传)

2024-03-18 13:38

本文主要是介绍【Android开发】使用OkHttp3下载文件(支持直接下载 / 支持断点续传),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用OkHttp3下载文件

1.直接下载版本:

        String filesDirPath = getFilesDir().getPath();        OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().get().url(URL).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {//}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {// Log.d(TAG, "onResponse.");InputStream inputStream = Objects.requireNonNull(response.body()).byteStream();File target = new File(filesDirPath, FILE_NAME);FileOutputStream fileOutputStream = new FileOutputStream(target);try {byte[] buffer = new byte[2048];int len;while ((len = inputStream.read(buffer)) != -1) {fileOutputStream.write(buffer, 0, len);// Log.d(TAG, "read: " + len);}fileOutputStream.flush();} catch (IOException e) {e.printStackTrace();}}});

2.断点续传版本

    final Call call = mOkhttpClient.newCall(request);range =dst.length();File dst = new File(downloadTo, PACKAGE_FILE_NAME);Callback callback = new Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {long hasDownload = dst.length();ResponseBody responseBody = response.body();try (InputStream inputStream = responseBody.byteStream();RandomAccessFile accessFile = new RandomAccessFile(dst, "rw")) {// 移动文件指针到断点续传的位置accessFile.seek(hasDownload);byte[] buffer = new byte[2048];int len;while (!stopDownload && -1 != (len = inputStream.read(buffer))) {accessFile.write(buffer, 0, len);hasDownload += len;}if (stopDownload) {LogUtil.i("Download paused.");return;}} catch (IOException e) {LogUtil.e("Download error. " + e.getMessage());return;}}};String rangeStr = String.format(Locale.CHINESE, "bytes=%d-", range);final Request request = new Request.Builder().url(url).header("Range", rangeStr).build();call.enqueue(callback);

总结

其实就是在下载前判断文件是否存在,是否已下载完成。一定要在本地记录该文件的配套元信息(Size,Url,MD5),用于判别。

这篇关于【Android开发】使用OkHttp3下载文件(支持直接下载 / 支持断点续传)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822517

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解