实现一个简易文件下载模块,给调用者提供接口,能够实现断点续传,防止重复下载,文件校验等等要求。
一、下载管理
/** * Created by fljustdoit. */ public class ChargingDownloadManager { private static List<String> loadingList = new ArrayList<String>(); public static void download(String url, File saveDir, String MD5, ChargingDownloadListenManager.DownloadListener listener) { if (!loadingList.contains(MD5)) { loadingList.add(MD5); DownloadTask task = new DownloadTask(url, saveDir, MD5, listener); new Thread(task).start(); } } private static final class DownloadTask implements Runnable { private String path; private File saveDir; private String MD5; private ChargingDownloadListenManager.DownloadListener mDownloadListener; private FileDownloader loader; public DownloadTask(String path, File saveDir, String MD5, ChargingDownloadListenManager.DownloadListener listener) { this.path = path; this.saveDir = saveDir; this.MD5 = MD5; this.mDownloadListener = listener; } public void run() { try { // 实例化一个文件下载器 loader = new FileDownloader(MD5, path, saveDir); loader.download(loadingList,mDownloadListener,MD5); } catch (Exception e) { if (null != loadingList && loadingList.contains(MD5)) { loadingList.remove(MD5); } mDownloadListener.onFailed(ChargingDownloadListenManager.FAILURE); } } } }这一部分通过传递MD5值对文件命名,保证文件的唯一性。创建一个列表存储正在被下载的任务,防止正在下载中的任务被多次下载。
二、文件下载器
/** * Created by fljustdoit. */ public class FileDownloader { private static final String TAG = "FileDownloader"; /* 原始文件长度 */ private long fileSize = 0; /* 线程 */ private ChargingDownloadThread thread; /* 本地保存文件 */ private File saveFile; /* 下载路径 */ private String downloadUrl; /** * 构建文件下载器