Android中http断点下载,Android HttpURLConnection断点下载(单线程)
HttpCilent 跟 HttpURLConnection 是安卓原生的用来实现http请求的类:
Android 6.0之后取消了HttpClient,不支持跟新 ,今天小编使用的是HttpURLConnection :
直接上代码:
URL url = null;
BufferedInputStream bin = null;
HttpURLConnection httpURLConnection = null;
Context context;
try {
//你要下载文件的路径
String urlPath = "MyUrlPath"
long fileSize = file.length;
//获取开始下载位置
long startOffset = getFileLength(context);
url = new URL(urlPath);
//获取HttpURLConnection对象
httpURLConnection = (HttpURLConnection) url.openConnection();
//设置请求方式
httpURLConnection.setRequestMethod("GET");
//设置字符编码,这个字符编码表示为头500个字节:Range: bytes=0-499
表示第二个500字节:Range: bytes=500-999
表示最后500个字节:Range: bytes=-500
表示500字节以后的范围:Range: bytes=500-
第一个和最后一个字节:Range: bytes=0-0,-1
同时指定几个范围:Range: bytes=500-600,601-999
httpURLConnection.setRequestProperty("Range","bytes=" + startOffset + "-");
// 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接)。
httpURLConnection.connect();
if(httpURLConnection.getResponseCode() == 206){
//if startOffset ==0 的时候,你就要把你的文件大小保存起来
//获取文件的大小httpURLConnection.getContentLength();
//当你第一次下载的时候,也就是你的起始位置是0的时候,这就是这个文件的总大小,如果bytes=xx 的范围大于0,那么你获取的值就是你的文件总大小-bytes
//获取文件输出流
bin = new BufferedInputStream(httpURLConnection.getInputStream());
//这个是你要保存在那个目录的位置
File folder= new File(DOWNLOADDIR);
//如果文件夹不存在则新建一个文件夹
if(!folder.exists()){
folder.mkdirs();
}
// 随机访问文件,可以指定断点续传的起始位置
//flieAbsolutePath 是你具体的文件路径
RandomAccessFile randomAccessFile = new RandomAccessFile(flieAbsolutePath,"rwd");
// rwd 跟 r 跟 w的区别是rwd:边读编写边下载 r读 w写
randomAccessFile.seek(startOffset);
byte[] buffer = new byte[2048];
int len;
//isStop可以用来实现暂停功能
while ((len = bin.read(buffer)) != -1 && !isStop) {
randomAccessFile.write(buffer,len);
startOffset += len;
//刷新下载进度
Message msg = new Message();
msg.what = (int)((startOffset * 100) / fileSize);
//使用handler发送消息刷新UI
handler.sendMessage(msg);
//保存下载的位置到SharedPreferences,下次下载的时候拿值写入设置字符编码
saveFileLength(context,startOffset);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(url != null){
url = null;
}
if(bin != null){
try {
bin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(httpURLConnection != null){
httpURLConnection.disconnect();
}
}
return null;
}
/**
* 保存文件长度
* @param context
* @param fileLength
*/
private static void saveFileLength(Context context,Long fileLength ){
SharedPreferences sp = context.getSharedPreferences("My_SP",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putLong("File_startOffset",fileLength);
editor.commit();
}
/**
* 获取文件长度
* @param context
* @return
*/
private static Long getFileLength(Context context){
SharedPreferences sp = context.getSharedPreferences("My_SP",Context.MODE_PRIVATE);
return sp.getLong("File_startOffset",0);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
Android中http断点下载,Android HttpURLConnection断点下载(单线程)相关推荐
- Android中通过SeekBar手动控制ProgressBar与模拟下载自动更新进度条
场景 进度条的常用场景: 通过SeekBar拖动进而更新ProgressBar进度条,比如调整音量效果等. 模拟下载实现自动更新进度条. 注: 博客: https://blog.csdn.net/ba ...
- 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )
文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...
- android中bmob云存储,Android中的Bmob移动后端云服务器功能
PS:一般情况下,我们在写android程序的时候,想要实现登录注册功能,可以选择自己用servlet作为服务端来实现过滤没有注册过的用户,但是太麻烦,而且不是随时都可以用的.这里介绍一个移动后端云服 ...
- android中九宫格的布局,Android布局--九宫格示例.doc
Android布局--九宫格示例.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. ...
- android中怎么网络判断,Android中判断网络是否连接实例详解
Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...
- android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...
实际开发中经常会遇到输入框,各种不同的需求,在一般情况下,清除内容,以及密码可见与不可见基本很常见,那么不废话直接上代码! 在res\values\attrs.xml中 .java import an ...
- android中自适应布局教程,Android自适应布局设计技巧
由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...
- 【译】Android中的安全数据— Android中的加密(第2部分)
目录 锁屏 选择一个钥匙 密钥存储 密钥生成 密钥管理 加密与解密 使用范例 下一步是什么 安全提示 锁屏 如果要保护数据,请保护设备. 为了更加安全,在提供对任何应用程序功能的访问权限之前,我们可以 ...
- 【译】Android中的安全数据— Android中的加密(第1部分)
目录 Java密码体系结构 Android Key Store 样例项目 下一步是什么 安全提示 Java密码体系结构 Android建立在Java密码体系结构(JCA)的基础上,该体系结构提供了用于 ...
- android中变量作用域,在 Android 和 Hilt 中限定作用域
将对象 A 的作用域限定到对象 B,指的是对象 B 的整个生命周期内始终持有相同的 A 实例.当涉及到 DI (依赖项注入) 时,限定对象 A 的作用域为一个容器,则意味着该容器在销毁之前始终提供相同 ...
最新文章
- 在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统
- 课时 18-Kubernetes 调度和资源管理(子誉)
- mysql日志恢复数据_Mysql 通过binlog日志恢复数据
- 科大星云诗社动态20210520
- 在ASP.NET Core下使用SignalR技术
- mysql远程备份工具_innobackupex实现MySQL远程备份
- 3串锂电池电量检测ic bq2060pdf及应用原理图_接受电源IC需求挑战,轻松实现精确调节的电源电压!...
- vivox50pro鸿蒙系统,小米10至尊纪念版和vivox50pro+哪一款手机好
- react 点击使父元素消失_React 基础:Refs 和 DOM 引用之间的关系
- java 请求 https_JAVA后端请求HTTPS 的URL 遇到的问题
- L2-007 家庭房产 (25 分)
- 【2019 NWERC - D 】Disposable Switches【最短路、单调栈、数学思维】
- 为什么培训班出来的程序员总遭人嫌弃?
- 项目中集成微信扫码登陆,绑定手机号功能
- 山东大学软件工程应用与实践——RIME输入法配置文件分析
- java 高效列转行,java 列转行
- 解决SELECT list is not in GROUP BY clause and contains nonaggregated column ‘XXX’
- Tiny4412汇编流水灯代码,Tiny4412裸机LED操作【转】
- Currency Trading: Dollar in a Funk as Traders Bet on Slow Rebound
- C语言——判断素数的几种方法以及相关题目
热门文章
- java中write方法报错_Java中管道报错:Write end dead
- python的convert_python编程开发之类型转换convert实例分析
- ajax传值controller怎么写,ajax如何传递参数给controller
- 电脑机箱cad图纸_如何批量打印高清黑白CAD图纸?这么好用的方法现在才知道
- 鸿蒙是内核名字,华为徐直军:鸿蒙只是内核的名字,是媒体给误解成操作系统...
- 安徽大学计算机考研学硕2019初试单科线,安徽大学2019年考研复试分数线已公布...
- Oracle客户端与java_Oracle 谈 JavaFX 及 Java 客户端技术的未来
- centos7 安装redis_Redis6安装(上) - 单机单实例
- homepod换wifi网络_如何实现短租网络自由,不必换房断网
- LSGO软件技术团队2015~2016学年第十周(1102~1108)总结