查看: 271|回复: 0

[Android教程] Android HttpURLConnection断点下载(单线程)

发表于 2017-11-11 10:37:19
太阳http代理AD

HttpCilent 跟 HttpURLConnection 是安卓原生的用来实现http请求的类:
Android 6.0之后取消了HttpClient,不支持跟新 ,今天小编使用的是HttpURLConnection :

直接上代码:

  1. URL url = null;
  2. BufferedInputStream bin = null;
  3. HttpURLConnection httpURLConnection = null;
  4. Context context;
  5. try {
  6. //你要下载文件的路径
  7. String urlPath = "MyUrlPath"
  8. long fileSize = file.length;
  9. //获取开始下载位置
  10. long startOffset = getFileLength(context);
  11. url = new URL(urlPath);
  12. //获取HttpURLConnection对象
  13. httpURLConnection = (HttpURLConnection) url.openConnection();
  14. //设置请求方式
  15. httpURLConnection.setRequestMethod("GET");
  16. //设置字符编码,这个字符编码表示为头500个字节:Range: bytes=0-499
  17. 表示第二个500字节:Range: bytes=500-999
  18. 表示最后500个字节:Range: bytes=-500
  19. 表示500字节以后的范围:Range: bytes=500-
  20. 第一个和最后一个字节:Range: bytes=0-0,-1
  21. 同时指定几个范围:Range: bytes=500-600,601-999
  22. httpURLConnection.setRequestProperty("Range" , "bytes=" + startOffset + "-");
  23. // 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接)。
  24. httpURLConnection.connect();
  25. if(httpURLConnection.getResponseCode() == 206){
  26. //if startOffset ==0 的时候,你就要把你的文件大小保存起来
  27. //获取文件的大小httpURLConnection.getContentLength();
  28. //当你第一次下载的时候,也就是你的起始位置是0的时候,这就是这个文件的总大小,如果bytes=xx 的范围大于0,那么你获取的值就是你的文件总大小-bytes
  29. //获取文件输出流
  30. bin = new BufferedInputStream(httpURLConnection.getInputStream());
  31. //这个是你要保存在那个目录的位置
  32. File folder= new File(DOWNLOADDIR);
  33. //如果文件夹不存在则新建一个文件夹
  34. if(!folder.exists()){
  35. folder.mkdirs();
  36. }
  37. // 随机访问文件,可以指定断点续传的起始位置
  38. //flieAbsolutePath 是你具体的文件路径
  39. RandomAccessFile randomAccessFile = new RandomAccessFile(flieAbsolutePath , "rwd");
  40. // rwd 跟 r 跟 w的区别是rwd:边读编写边下载 r读 w写
  41. randomAccessFile.seek(startOffset);
  42. byte[] buffer = new byte[2048];
  43. int len;
  44. //isStop可以用来实现暂停功能
  45. while ((len = bin.read(buffer)) != -1 && !isStop) {
  46. randomAccessFile.write(buffer, 0, len);
  47. startOffset += len;
  48. //刷新下载进度
  49. Message msg = new Message();
  50. msg.what = (int)((startOffset * 100) / fileSize);
  51. //使用handler发送消息刷新UI
  52. handler.sendMessage(msg);
  53. //保存下载的位置到SharedPreferences,下次下载的时候拿值写入设置字符编码
  54. saveFileLength(context , startOffset);
  55. }
  56. }
  57. } catch (MalformedURLException e) {
  58. e.printStackTrace();
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. }finally {
  62. if(url != null){
  63. url = null;
  64. }
  65. if(bin != null){
  66. try {
  67. bin.close();
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. if(httpURLConnection != null){
  73. httpURLConnection.disconnect();
  74. }
  75. }
  76. return null;
  77. }
  78. /**
  79. * 保存文件长度
  80. * @param context
  81. * @param fileLength
  82. */
  83. private static void saveFileLength(Context context ,Long fileLength ){
  84. SharedPreferences sp = context.getSharedPreferences("My_SP" , Context.MODE_PRIVATE);
  85. SharedPreferences.Editor editor = sp.edit();
  86. editor.putLong("File_startOffset" , fileLength);
  87. editor.commit();
  88. }
  89. /**
  90. * 获取文件长度
  91. * @param context
  92. * @return
  93. */
  94. private static Long getFileLength(Context context){
  95. SharedPreferences sp = context.getSharedPreferences("My_SP" , Context.MODE_PRIVATE);
  96. return sp.getLong("File_startOffset" , 0);
  97. }
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。



太阳http代理AD
回复

使用道具 举报