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断点下载(单线程)相关推荐

  1. Android中通过SeekBar手动控制ProgressBar与模拟下载自动更新进度条

    场景 进度条的常用场景: 通过SeekBar拖动进而更新ProgressBar进度条,比如调整音量效果等. 模拟下载实现自动更新进度条. 注: 博客: https://blog.csdn.net/ba ...

  2. 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )

    文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...

  3. android中bmob云存储,Android中的Bmob移动后端云服务器功能

    PS:一般情况下,我们在写android程序的时候,想要实现登录注册功能,可以选择自己用servlet作为服务端来实现过滤没有注册过的用户,但是太麻烦,而且不是随时都可以用的.这里介绍一个移动后端云服 ...

  4. android中九宫格的布局,Android布局--九宫格示例.doc

    Android布局--九宫格示例.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. ...

  5. android中怎么网络判断,Android中判断网络是否连接实例详解

    Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...

  6. android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...

    实际开发中经常会遇到输入框,各种不同的需求,在一般情况下,清除内容,以及密码可见与不可见基本很常见,那么不废话直接上代码! 在res\values\attrs.xml中 .java import an ...

  7. android中自适应布局教程,Android自适应布局设计技巧

    由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...

  8. 【译】Android中的安全数据— Android中的加密(第2部分)

    目录 锁屏 选择一个钥匙 密钥存储 密钥生成 密钥管理 加密与解密 使用范例 下一步是什么 安全提示 锁屏 如果要保护数据,请保护设备. 为了更加安全,在提供对任何应用程序功能的访问权限之前,我们可以 ...

  9. 【译】Android中的安全数据— Android中的加密(第1部分)

    目录 Java密码体系结构 Android Key Store 样例项目 下一步是什么 安全提示 Java密码体系结构 Android建立在Java密码体系结构(JCA)的基础上,该体系结构提供了用于 ...

  10. android中变量作用域,在 Android 和 Hilt 中限定作用域

    将对象 A 的作用域限定到对象 B,指的是对象 B 的整个生命周期内始终持有相同的 A 实例.当涉及到 DI (依赖项注入) 时,限定对象 A 的作用域为一个容器,则意味着该容器在销毁之前始终提供相同 ...

最新文章

  1. 在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统
  2. 课时 18-Kubernetes 调度和资源管理(子誉)
  3. mysql日志恢复数据_Mysql 通过binlog日志恢复数据
  4. 科大星云诗社动态20210520
  5. 在ASP.NET Core下使用SignalR技术
  6. mysql远程备份工具_innobackupex实现MySQL远程备份
  7. 3串锂电池电量检测ic bq2060pdf及应用原理图_接受电源IC需求挑战,轻松实现精确调节的电源电压!...
  8. vivox50pro鸿蒙系统,小米10至尊纪念版和vivox50pro+哪一款手机好
  9. react 点击使父元素消失_React 基础:Refs 和 DOM 引用之间的关系
  10. java 请求 https_JAVA后端请求HTTPS 的URL 遇到的问题
  11. L2-007 家庭房产 (25 分)
  12. 【2019 NWERC - D 】Disposable Switches【最短路、单调栈、数学思维】
  13. 为什么培训班出来的程序员总遭人嫌弃?
  14. 项目中集成微信扫码登陆,绑定手机号功能
  15. 山东大学软件工程应用与实践——RIME输入法配置文件分析
  16. java 高效列转行,java 列转行
  17. 解决SELECT list is not in GROUP BY clause and contains nonaggregated column ‘XXX’
  18. Tiny4412汇编流水灯代码,Tiny4412裸机LED操作【转】
  19. Currency Trading: Dollar in a Funk as Traders Bet on Slow Rebound
  20. C语言——判断素数的几种方法以及相关题目

热门文章

  1. java中write方法报错_Java中管道报错:Write end dead
  2. python的convert_python编程开发之类型转换convert实例分析
  3. ajax传值controller怎么写,ajax如何传递参数给controller
  4. 电脑机箱cad图纸_如何批量打印高清黑白CAD图纸?这么好用的方法现在才知道
  5. 鸿蒙是内核名字,华为徐直军:鸿蒙只是内核的名字,是媒体给误解成操作系统...
  6. 安徽大学计算机考研学硕2019初试单科线,安徽大学2019年考研复试分数线已公布...
  7. Oracle客户端与java_Oracle 谈 JavaFX 及 Java 客户端技术的未来
  8. centos7 安装redis_Redis6安装(上) - 单机单实例
  9. homepod换wifi网络_如何实现短租网络自由,不必换房断网
  10. LSGO软件技术团队2015~2016学年第十周(1102~1108)总结