临近过年,今天将花了两天时间写的下载模块贡献出来,以前我也是天天需要什么功能,就天天查百度,现在自己也能开源一点东西了,也是非常很开心的,hahaha。
离职前写了音乐播放器的音乐下载界面,自己封装了下载线程,并使用多线程断点续传下载音乐,感觉多线程下载音乐也并不比单线程下载快多少,就一个4M的音乐来说,开3条线程下了46s,单线程下了60s,如果同时现在3个音乐,那么多线程下载相当于开了9 个线程,速度尽然和单线程的速度持平,有时候还会慢于3条线程,于是我放弃了多线程断点续传,还是老老实实写单线程的吧(- -!我觉得应该是我的下载线程的毛病,哈哈)。。。
于是今天就用了xutils3的网络访问模块,实现的需求是。
1、APP关闭后(kill),重新开启时,能记录当前下载进度,断点续传。
2、音乐能增删,暂停,显示下载速度和下载进度。
其实都写好了哈,主要说说编码思路。
通过Acitivity的bindService,可以调用service的bind来传递需要下载的文件信息到service,service通过调用xutils的带进度的下载模块,来回调下载信息,同时service通过下载观察者不断观察下载进度,将进度传递给Activity,之后setAdapter即可。
里面最主要的东西就是DownloadService,所有的代码逻辑都是这个类处理的。
传递下载文件信息的类MainActivity
这个类有个问题,
就是文件名的获取是根据Url倒叙截取/后面的文件来命名的,如果你的url不符合规则,请自行定义。
private String getfileName(String url) {//根据下载地址给下载文件命名
try{
return url.substring(url.lastIndexOf("/") + 1);
}catch (Exception ex){
return mBinder.getCurrentListSize()+"";//返回一个数字
}
}
权限问题
代码中加了6.0的动态权限判断,因为要操作SD卡,所以这里也要注意。
因为我没有6.0的测试手机,所以这里虽然都写了,但是只是作为提示使用,需要你自己更改逻辑位置,如果是6.0以下的,并没有问题的 。
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
Toast.makeText(getBaseContext(),"已获取SD卡权限",Toast.LENGTH_SHORT).show();
//6.0系统在这里进行service的初始化
break;
case 1:
Toast.makeText(getBaseContext(),"SD卡权限未开启",Toast.LENGTH_SHORT).show();
break;
}
}
};
//判断权限方法
private void initCheckSelfPermission() {
//判断是否有内存卡权限
CheckSelfPermission.getSDCard(this);
}
//动态权限回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
doNext(requestCode,grantResults);
}
//动态权限回调,yes和no点击
private void doNext(int requestCode, int[] grantResults) {
if (requestCode == DownLoadConstant.WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
LogUtils.d("权限获取成功");
handler.sendEmptyMessage(0);
} else {
handler.sendEmptyMessage(1);
}
}
}
最关键的是DownloadService ,bind里有对外提供的增删改查方法
在下载的过程中,有缓存GetFileSharePreance 不断在保存下载的urls下载地址列表和文件下载进度,为APP下次重启提供断点,里面有详细注释。
/**
* 作者:朱亮 on 2017/1/17 15:36
* 邮箱:171422696@qq.com
* 下载服务类,执行下载任务,并将进度传递到Activity中(这里用一句话描述这个方法的作用)
*/
public class DownloadService extends Service {
public static final String ACTION_START = "ACTION_START";
public static final String ACTION_STOP = "ACTION_STOP";
public static final String ACTION_DELETE = "ACTION_DELETE";
private List<OnDownLoadBackListener> loadBackListeners = new ArrayList<