文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-05-31 07:20

关注

这期内容当中小编将会给大家带来有关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);   } } 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯