返回顶部
首页 > 资讯 > 精选 >Android应用中的断点续传下载如何利用HTTP协议实现
  • 857
分享到

Android应用中的断点续传下载如何利用HTTP协议实现

androidhttproi 2023-05-31 07:05:44 857人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关Android应用中的断点续传下载如何利用Http协议实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。FileDownloader.java   

这期内容当中小编将会给大家带来有关Android应用中的断点续传下载如何利用Http协议实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

FileDownloader.java                                                                                                              

package cn.itcast.net.download; import java.io.File; import java.io.RandoMaccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.util.LinkedHashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import cn.itcast.service.FileService;  import android.content.Context; import android.util.Log;  public class FileDownloader {   private static final String TAG = "FileDownloader";   private Context context;   private FileService fileService;        private int downloadSize = 0;      private int fileSize = 0;      private DownloadThread[] threads;      private File saveFile;      private Map<Integer, Integer> data = new ConcurrentHashMap<Integer, Integer>();      private int block;      private String downloadUrl;      public int getThreadSize() {     return threads.length;   }      public int getFileSize() {     return fileSize;   }      protected synchronized void append(int size) {     downloadSize += size;   }      protected synchronized void update(int threadId, int pos) {     this.data.put(threadId, pos);     this.fileService.update(this.downloadUrl, this.data);   }      public FileDownloader(Context context, String downloadUrl, File fileSaveDir, int threadNum) {     try {       this.context = context;       this.downloadUrl = downloadUrl;       fileService = new FileService(this.context);       URL url = new URL(this.downloadUrl);       if(!fileSaveDir.exists()) fileSaveDir.mkdirs();       this.threads = new DownloadThread[threadNum];                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();       conn.setConnectTimeout(5*1000);       conn.setRequestMethod("GET");       conn.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msWord, *   private String getFileName(HttpURLConnection conn) {     String filename = this.downloadUrl.substring(this.downloadUrl.lastIndexOf('/') + 1);     if(filename==null || "".equals(filename.trim())){//如果获取不到文件名称       for (int i = 0;; i++) {         String mine = conn.getHeaderField(i);         if (mine == null) break;         if("content-disposition".equals(conn.getHeaderFieldKey(i).toLowerCase())){           Matcher m = Pattern.compile(".*filename=(.*)").matcher(mine.toLowerCase());           if(m.find()) return m.group(1);         }       }       filename = UUID.randomUUID()+ ".tmp";//默认取一个文件名     }     return filename;   }         public int download(DownloadProgressListener listener) throws Exception{     try {       RandomAccessFile randOut = new RandomAccessFile(this.saveFile, "rw");       if(this.fileSize>0) randOut.setLength(this.fileSize);       randOut.close();       URL url = new URL(this.downloadUrl);       if(this.data.size() != this.threads.length){         this.data.clear();         for (int i = 0; i < this.threads.length; i++) {           this.data.put(i+1, 0);//初始化每条线程已经下载的数据长度为0         }       }       for (int i = 0; i < this.threads.length; i++) {//开启线程进行下载         int downLength = this.data.get(i+1);         if(downLength < this.block && this.downloadSize<this.fileSize){//判断线程是否已经完成下载,否则继续下载            this.threads[i] = new DownloadThread(this, url, this.saveFile, this.block, this.data.get(i+1), i+1);           this.threads[i].setPriority(7);           this.threads[i].start();         }else{           this.threads[i] = null;         }       }       this.fileService.save(this.downloadUrl, this.data);       boolean notFinish = true;//下载未完成       while (notFinish) {// 循环判断所有线程是否完成下载         Thread.sleep(900);         notFinish = false;//假定全部线程下载完成         for (int i = 0; i < this.threads.length; i++){           if (this.threads[i] != null && !this.threads[i].isFinish()) {//如果发现线程未完成下载             notFinish = true;//设置标志为下载没有完成             if(this.threads[i].getDownLength() == -1){//如果下载失败,再重新下载               this.threads[i] = new DownloadThread(this, url, this.saveFile, this.block, this.data.get(i+1), i+1);               this.threads[i].setPriority(7);               this.threads[i].start();             }           }         }                 if(listener!=null) listener.onDownloadSize(this.downloadSize);//通知目前已经下载完成的数据长度       }       fileService.delete(this.downloadUrl);     } catch (Exception e) {       print(e.toString());       throw new Exception("file download fail");     }     return this.downloadSize;   }      public static Map<String, String> getHttpResponseHeader(HttpURLConnection http) {     Map<String, String> header = new LinkedHashMap<String, String>();     for (int i = 0;; i++) {       String mine = http.getHeaderField(i);       if (mine == null) break;       header.put(http.getHeaderFieldKey(i), mine);     }     return header;   }      public static void printResponseHeader(HttpURLConnection http){     Map<String, String> header = getHttpResponseHeader(http);     for(Map.Entry<String, String> entry : header.entrySet()){       String key = entry.geTKEy()!=null &#63; entry.getKey()+ ":" : "";       print(key+ entry.getValue());     }   }    private static void print(String msg){     Log.i(TAG, msg);   } } 

--结束END--

本文标题: Android应用中的断点续传下载如何利用HTTP协议实现

本文链接: https://lsjlt.com/news/224185.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作