## 功能特性
+ 断点续传
+ 支持多线程 *(目前版本仅支持单任务单线程,多任务才多线程,未来会继续完善单任务的多线程执行)*
## 使用本项目的理由
- **可靠稳定** *(我们拥有近百万用户的某个app项目,迭代了近二十个版本,该下载模块久经考验,工作正常)*
- **体积很小** *(总计只有数十个java文件)*
- **无其他依赖** *(仅使用sdk本身的api,没有依赖任何第三方库)*
- **接入方式简单**
![download_demo](/blob/master/docs/img/download_three.gif)
## 导入项目
```
implementation 'com.yaoxiaowen:download:1.4.1'
```
## 使用方式
#### 1, **注册**
`AndroidManifest.xml`中需要注册权限和`service`.(读写文件的权限要在代码中动态申请,不要忘记这点了)
```
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```
#### 2, **开始/暂停/重启 下载任务。**
+ 开始
```java
//先获得这个单例对象
mDownloadHelper = DownloadHelper.getInstance();
//执行两个下载任务
mDownloadHelper.addTask(firstUrl, firstFile, FIRST_BC_ACTION)
.addTask(secondUrl, secondFile, SECOND_BC_ACTION)
.submit(this);
//当然,下面这样分开写,自然也可以
mDownloadHelper.addTask(firstUrl, firstFile, FIRST_BC_ACTION)
.submit(this);
mDownloadHelper.addTask(secondUrl, secondFile, SECOND_BC_ACTION)
.submit(this);
```
+ 暂停
```java
mDownloadHelper.pauseTask(firstUrl, firstFile, FIRST_BC_ACTION)
.submit(this);
```
+ 重启
当下载任务被暂停/结束后,想要重新启动时,和开始下载操作相同,直接 `addTask().submit`即可从上一次下载断点处开始下载。
> 当我们执行多个下载任务时,内部会维护任务列表。线程池维护多个线程,执行下载任务。 单个任务只采用单一线程执行任务。
#### 3, **广播接收信息**
我们通过广播来进行通讯。广播携带下载文件的相关信息。
以下情况会发送广播。
> + 当下载任务的状态发生改变时。(比如开始,准备,失败,暂停等状态改变).
> + 在 **LOADING(下载中)** 状态时,默认每间隔1s就发送广播。
###### 注册广播
```java
//广播不要忘记注册和反注册。
IntentFilter filter = new IntentFilter();
filter.addAction(FIRST_BC_ACTION);
registerReceiver(receiver, filter);
```
###### 接收信息
```java
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (null != intent) {
switch (intent.getAction()) {
case FIRST_BC_ACTION:{
/**
* 我们接收到的FileInfo对象,包含了下载文件的各种信息。
* 然后我们就可以做我们想做的事情了。
* 比如更新进度条,改变状态等。
*/
com.yaoxiaowen.download.FileInfo fileInfo =
(FileInfo) intent.getSerializableExtra(
com.yaoxiaowen.download.DownloadConstant.DOWNLOAD_EXTRA);
}
break;
default:
}
}
}//end of "onReceive(..."
};
```
> 使用方式很简单,这里有两个demo。[执行三个下载任务](/blob/master/sample/src/main/java/com/yaoxiaowen/download/sample/MainActivity.java) 或 [执行一个下载任务](/blob/master/sample/src/main/java/com/yaoxiaowen/download/sample/SimpleMainActivity.java)
## API和相关常量
#### **1. DownloadHelper.java**
```java
package com.yaoxiaowen.download;
/**
* 该类采用 单例 设计模式
*/
public class DownloadHelper {
/**
* 提交 下载/暂停 等任务.(提交就意味着开始执行生效)
* @param context
*/
public synchronized void submit(Context context);
/**
* 添加 新的下载任务
*
* @param url 下载的url
* @param file 存储在某个位置上的文件
* @param action 下载过程会发出广播信息.该参数是广播的action
* @return DownloadHelper自身 (方便链式调用)
*/
public DownloadHelper addTask(String url, File file, @Nullable String action);
/**
* 暂停某个下载任务
*
* @param url 下载的url
* @param file 存储在某个位置上的文件
* @param action 下载过程会发出广播信息.该参数是广播的action
* @return DownloadHelper自身 (方便链式调用)
*/
public DownloadHelper pauseTask(String url, File file, @Nullable String action);
}
```
#### **2. FileInfo.java**
```java
package com.yaoxiaowen.download;
/**
* 文件信息,javaBean形式
*/
public class FileInfo implements Serializable{
private String id; //文件的唯一标识符 (url+文件存储路径)
private String downloadUrl; //下载的url
private String filePath; //文件存放的路径位置
private long size; //文件的总尺寸
private long downloadLocation; // 下载的位置(就是当前已经下载过的size,也是断点的位置)
@IntRange(from = DownloadStatus.WAIT, to = DownloadStatus.FAIL)
private int downloadStatus = DownloadStatus.PAUSE; //下载的状态信息
}
```
#### **3. DownloadConstant.java**
```java
package com.yaoxiaowen.download;
public class DownloadConstant {
/**
* 下载过程会通过发送广播, 广播通过intent携带文件数据的 信息。
* intent 的key值就是该字段
* eg : FileInfo fileInfo = (FileInfo) intent.getSerializableExtra(DownloadConstant.EXTRA_INTENT_DOWNLOAD);
*/
public static final String EXTRA_INTENT_DOWNLOAD = "yaoxiaowen_download_extra";
}
```
#### **4. DownloadConstant.java**
```java
package com.yaoxiaowen.download;
/**
* 标示着 下载过程中的状态
*/
public class DownloadStatus {
// Answer to the Ultimate Question of Life, The Universe, and Everything is 42
public static final int WAIT = 42; //等待
public static final int PREPARE = 43; //准备
public static final int LOADING = 44; //下载中
public static final int PAUSE = 45; //暂停
public static final int COMPLETE = 46; //完成
public static final int FAIL = 47; //失败
}
```
## TODO
+ 对于单一任务的多线程执行。
+ 能够监听网络状态,自动暂停和恢复。
+ 多线程的加锁方式的优化,提高效率。
## 技术原理简介
所谓断点下载,其实也不复杂。注意以下几点内容。
+ `httpURLconnection#setRequestProperty`方法通过设置,可以从服务器指定位置读取数据。eg:`conn.setRequestProperty("Range", "bytes=" + 500 + "-" + 1000);`
+ 普通的`File`对象并不支持从指定位置写入数据,我们需要使用`RandomAccessFile`来实现从指定位置给文件写入数据的功能。`void seek(long offset)`
+ 每次下载时,需要记录断点的位置信息。(本项目中使用`sqlite`数据库来实现持久化)
+ 通过`ThreadPoolExecutor`来维护线程池。
> 关于多线程断点续传下载的文章,网上很多了,大家可以参考。
## other
+ *使用过程中有什么问题,可以提交issues或联系本人,尽力予以解决。*
免责声明:
1.本资源仅供学习和交流使用,不保证其准确性、完整性、及时性或适用性。
2.本资源仅包含一般信息,不构成专业建议。在使用本资源时,请务必自行研究并谨慎决策。
3.我已尽力确保本资源的正确性和合
没有合适的资源?快使用搜索试试~ 我知道了~
一个支持多线程断点续传功能的Android下载工具.zip
共59个文件
java:25个
xml:12个
png:10个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 156 浏览量
2024-03-03
14:33:41
上传
评论
收藏 395KB ZIP 举报
温馨提示
一个支持多线程断点续传功能的Android下载工具.zip 功能特性 断点续传 支持多线程 (目前版本仅支持单任务单线程,多任务才多线程,未来会继续完善单任务的多线程执行)
资源推荐
资源详情
资源评论
收起资源包目录
一个支持多线程,断点续传功能的Android下载工具.zip (59个子文件)
DownloadHelper-master
downloaderHelper
src
androidTest
java
com
yaoxiaowen
download
ExampleInstrumentedTest.java 755B
test
java
com
yaoxiaowen
download
ExampleUnitTest.java 401B
main
java
com
yaoxiaowen
download
FileInfo.java 2KB
DownloadConstant.java 495B
DownloadHelper.java 3KB
utils
LogUtils.java 4KB
DebugUtils.java 1KB
ToastUtils.java 601B
execute
DownloadTask.java 8KB
DownloadExecutor.java 1KB
service
DownloadService.java 5KB
config
InnerConstant.java 1KB
bean
DownloadInfo.java 1KB
RequestInfo.java 999B
DownloadStatus.java 609B
db
DbHolder.java 4KB
DbOpenHelper.java 2KB
res
values
strings.xml 79B
AndroidManifest.xml 448B
proguard-rules.pro 950B
build.gradle 2KB
.gitignore 7B
sample
src
androidTest
java
com
yaoxiaowen
download
sample
ExampleInstrumentedTest.java 764B
test
java
com
yaoxiaowen
download
sample
ExampleUnitTest.java 408B
main
java
com
yaoxiaowen
download
sample
SimpleMainActivity.java 7KB
TestActivity.java 4KB
utils
Utils_Parse.java 1KB
Utils_Toast.java 731B
Constanst.java 810B
MainActivity.java 11KB
res
mipmap-xxhdpi
ic_launcher_round.png 10KB
ic_launcher.png 8KB
mipmap-hdpi
ic_launcher_round.png 4KB
ic_launcher.png 3KB
mipmap-mdpi
ic_launcher_round.png 2KB
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher_round.png 14KB
ic_launcher.png 10KB
mipmap-xhdpi
ic_launcher_round.png 6KB
ic_launcher.png 5KB
values
colors.xml 208B
strings.xml 77B
styles.xml 383B
layout
activity_simple_main.xml 1KB
activity_test.xml 1KB
activity_main.xml 4KB
drawable
shape_btn_blue.xml 188B
selector_btn.xml 514B
shape_btn_orangle.xml 188B
AndroidManifest.xml 1KB
proguard-rules.pro 950B
build.gradle 1KB
.gitignore 7B
build.gradle 1KB
docs
开发记录 20B
img
download_three.gif 319KB
settings.gradle 45B
.gitignore 943B
README.md 8KB
共 59 条
- 1
资源评论
武昌库里写JAVA
- 粉丝: 3136
- 资源: 1872
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功