多线程下载器(不含数据库部分)
1、写在前面:
虽然demo中程序框架已搭建完成,但是由于笔者时间原因,暂时只完成了核心部分:多线程下载的部分,其他数据库、服务通知、暂停部分还未添加到项目中。
2、相关知识点:
(1)Java线程及停止线程的方式
(2)Java RandomAccessFile文件操作
(3)HttpURLConnection相关range字段的配置
(4)Sqlite同步操作
2、核心思想:
(1)通过HttpURLConnection判断服务器是否支持断电续传:
<1>否->直接开启普通的多线程下载(遇到断网等情况便会重新下载)
<2>是->开启普通的多线程下载,但是每个线程都含有自己的下载进度信息,以便断网或用户暂停开始重新下载重新开启下载。笔者在针对不同的下载尺寸智能的分配不同的线程数量去下载资源,通过设置缓冲区大小来提高下载速度。
3、核心技术:
(1)HttpURLConnection的配置
(2)RandomAccessFile随机文件的读取以及缓冲区的设置
(3)线程的暂停与启动
4、分析结果:
(1)将功能划分为三大部分:下载器(统一的外部接口)、存储器(内部的存储实现)、通知服务(用户交互部分)。
(2)项目结构:
5、核心代码:
package com.jx.downloader;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import com.jx.dbhelper.DownloadRecordDB;
import com.jx.model.DownloadModel;
/**
* 自定义下载器: 1、根据即将下载的内容大小智能的分配下载线程数量,每个线程通过Downloader携带自身线程的下载信息(下载起点、终点、线程名称)
* 2、如果服务器支持断电续传则开启数据库
* ,在下载处于暂停的状态时(导致下载暂停的原因可能是手动暂停或者网络不佳),自动保存下载信息到数据库,在取消下载的时候自动清空数据库信息,
* 重新开始下载的时候,读取内容重新下载(一般情况本地存储变量还未被回收,不必从数据库重新读取) 2、使用RandomAccessFile存储下载的内容
*
* @author J_X 2016年3月19日09:58:00
*/
public class JX_Downloa