大文件 and 多下载任务的封装(三)--断点续传,下载类的整合封装,以及使用

本文介绍了如何实现大文件的断点续传功能,通过分析操作原理并结合HttpURLConnection的特性,设计了子线程的执行策略。文章详细讲解了ThreadManager的使用,并提供了DownLoadManager和DownLoadInfo等相关代码示例,展示了多线程下载的完整流程。
摘要由CSDN通过智能技术生成

ThreadManager

大文件 and 多下载任务的封装一
大文件 and 多下载任务的封装二
原文地址

上两篇文章中我们主要讲述了ThreadPool ,以及 Observer(观察者模式)这些基本的工具类只是起到了辅助的作用,现在我们来分析一下,直接从网络上;拉取数据的过程,

一.断电续传的操作原理\

首先我们假设读者都已经了解了基本的从网络上拉取数据文件的操作,那么现在我们只需要在原有的基础上增加一个方法,在HttpURLConnection类中提供了一个方法,

//设置范围,格式为Range:bytes x-y;
//也就是从currentPos 下载到 Maxsize,这个方法可以满足断点续传操作,我们要做的只是保存下载进度,然后调用这个方法即可
.setRequestProperty("Range", "bytes=" + currentPos + "-" + Maxsize);`

二.子线程的实现

根据第一篇文章我们可以了解到,如果想要使用线程池必须动态的添加与移除子线程,所以为了方便操作,我们可以新建一个类来执行下载的操作,伪代码如下:

//用来执行下载操作
 class DownLoadTask implements Runnable{
   
        @Override
        public void run() {
                    // 1.设置范围,格式为Range:bytes x-y;
                    connection.setRequestProperty("Range", "bytes=" + dlInfo.currentPos + "-" + dlInfo.size);
                    randomAccessFile = new RandomAccessFile(file, "rwd");
                    //2.从当前已下载节点开始保存文件
                    randomAccessFile.seek(0 + dlInfo.currentPos);
                    //3.将要下载的文件写到保存在保存路径下的文件中
                    is = connection.getInputStream();
                    byte[] buffer = new byte[4096];
                    int length = -1;
                    while ((length = is.read(buffer)) != -1) {
                        randomAccessFile.write(buffer, 0, length);
                        currentPos += length;

                    }

        }
   }

三.使用

下面将给出ThreadManager,DownLoadManager 在一块完成文件下载的使用过程

DownLoadServer down = new DownLoadServer(){};
 mDM = DownLoadManager.getInstance();
        mDM.registerObserver(this);// 注册观察者, 监听状态和进度变化
         mDM.download((T extends DownLoadInfo));

四.代码

DownLoadManager.java
//


package com.example.orchid.googleplatstore.manager;

import android.content.Intent;
import android.net.Uri;
import android.util.Log;

import com.example.orchid.googleplatstore.Utils.IOUtils;
import com.example.orchid.googleplatstore.Utils.UIUtils;
import com.example.orchid.googleplatstore.http.HttpHelper;
import com.example.orchid.googleplatstore.ui.domin.Appinfo;
import com.example.orchid.googleplatstore.ui.domin.DownLoadInfo;

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Created by orchid
 * on 16-11-4.
 * 使用观察者设计模式
 * 1.创建被观察者模式的接口
 * 2.创建被观察者集合,用来保存所有的观察者
 * 3.注册观察者--将观察者接口,添加到集合中
 * 4.注销观察者--将观察者接口从集合中移除
 * 5.更新数据提醒观察者--循环遍历所有的观察者,状态,进度改变调用方法
 *
 *下载的状态分为六种,未下载--等待--下载中--暂停--下载错误--下载成功
 *
 */

public class DownLoadManager {
   
    private static 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值