Files
SNFLauncherMain_AllWinner/mylibrary/src/main/java/com/android/download/DownLoadManeger.java
康述龙 ecdbb788f5 1.广告位上报接口和对已上报进行Sharedference存储
2.对广告位更新资源对Sharedference进行清除
2025-11-21 19:29:53 +08:00

298 lines
11 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.android.download;
import android.content.Context;
import android.text.TextUtils;
import com.android.database.DaoManager;
import com.android.database.lib.DownLoadTaskBean;
import com.android.util.GsonUtil;
import com.android.util.LogUtils;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class DownLoadManeger {
private static DownLoadManeger instance;
private boolean isAuto = false;
private DownloadListener mDownloadListener;
public void registerDownloadListener(DownloadListener downloadListener){
this.mDownloadListener = downloadListener;
}
public void unRegisterDownloadListener(DownloadListener downloadListener){
this.mDownloadListener = null;
}
private DownLoadManeger(Context context) {
DaoManager.initeDao(context);
}
public static DownLoadManeger init(Context context){
if (instance == null)
instance = new DownLoadManeger(context);
return instance;
}
public static DownLoadManeger getInstance() {
return instance;
}
/**添加新的下载任务*/
public void addDownloadTask(DownloadBuilder builder){
if (TextUtils.isEmpty(builder.url)){
return;
}
DownLoadTaskBean downLoadTaskBean = null;
if(!isExistTask(builder.url)){
downLoadTaskBean = createTaskBean(builder);
}else {
LogUtils.loge("该下载任务已存在无需下载:");
return;
}
//添加下载任务队列
if( !TaskQueue.getInstance().isExistTask(downLoadTaskBean)) {
TaskQueue.getInstance().add(new DownLoadTaskThread(downLoadTaskBean, observer));//添加到下载队列中
}else {
LogUtils.loge("该下载任务已存在:"+ GsonUtil.GsonString(downLoadTaskBean));
}
}
/**下载没有完成的任务管理*/
public void restDownloadTask(){
List<DownLoadTaskBean> list = DaoManager.getInstance().queryList(DownLoadTaskBean.class); //未完成下载的任务
if(list.size()>0){
LogUtils.loge("start download");
for (DownLoadTaskBean downLoadTaskBean:list){
//添加下载任务队列
if( !TaskQueue.getInstance().isExistTask(downLoadTaskBean)) {
TaskQueue.getInstance().add(new DownLoadTaskThread(downLoadTaskBean, observer));//添加到下载队列中
}
}
}else {
LogUtils.loge("no download task");
}
}
/**清除任务队列*/
public void clear(){
TaskQueue.getInstance().clear();
}
public boolean isExistTask(String url) {//判断是否存在下载任务
List<DownLoadTaskBean> downLoadTaskBeans = DaoManager.getInstance().queryByKeyList(DownLoadTaskBean.class,"url",url);
if(downLoadTaskBeans!=null&&downLoadTaskBeans.size()==1){
return true;
}
return false;
}
private DownLoadTaskBean createTaskBean(DownloadBuilder builder) {//创建下载任务bean和创建下载任务
DownLoadTaskBean bean = new DownLoadTaskBean();
bean.setFileName(builder.name);
bean.setPath(builder.path);
bean.setUrl(builder.url);
bean.setTaskId(System.currentTimeMillis());
bean.setListener(builder.listener);
bean.setTotal(builder.total);
bean.setMinType(builder.minType);
bean.setTaskType(builder.taskType);
DownLoadTaskThread task = new DownLoadTaskThread(bean, observer);
DaoManager.getInstance().insert(DownLoadTaskBean.class, bean);//保存到数据库
return bean;
}
//自动下载
public void setAutoDownLoad(boolean isAuto) {
this.isAuto = isAuto;
}
public void pauseAll() {//全部暂停
TaskQueue.getInstance().pause();
}
public void clearTaskInteruptQueueAndRestart() {
List<DownLoadTaskBean> list = DaoManager.getInstance().queryList(DownLoadTaskBean.class);
for (DownLoadTaskBean downLoadTaskBean:list) {
if(!TextUtils.isEmpty(downLoadTaskBean.getUrl())&&!TextUtils.isEmpty(downLoadTaskBean.getFileName())&&!TextUtils.isEmpty(downLoadTaskBean.getPath())){
File file = new File(downLoadTaskBean.getPath()+downLoadTaskBean.getFileName()+"-tmp");
if(file.exists()&&downLoadTaskBean.getCurrentProgress()==file.length()&&file.length()<=downLoadTaskBean.getTotal()){
TaskQueue.getInstance().remove(downLoadTaskBean);
TaskQueue.getInstance().add(new DownLoadTaskThread(downLoadTaskBean, observer));
}else if(downLoadTaskBean.getTaskType()==1){//apk 下载完成未安装断电重新启动下载任务 因为需要安装apk
File apkFile = new File(downLoadTaskBean.getPath()+downLoadTaskBean.getFileName());
if(apkFile.exists()&&apkFile.length()==downLoadTaskBean.getTotal()&&downLoadTaskBean.getCurrentProgress()<downLoadTaskBean.getTotal()){
TaskQueue.getInstance().remove(downLoadTaskBean);
TaskQueue.getInstance().add(new DownLoadTaskThread(downLoadTaskBean, observer));
}
}else if(downLoadTaskBean.getTaskType()==0){//图片文件下载完成 删除downloadtaskbean表数据脏数据
File imgFile = new File(downLoadTaskBean.getPath()+downLoadTaskBean.getFileName());
if(imgFile.exists()&&imgFile.length()==downLoadTaskBean.getTotal()){
DaoManager.getInstance().delete(DownLoadTaskBean.class,downLoadTaskBean);
}
}
if(!file.exists()&&downLoadTaskBean.getCurrentProgress()==0){
LogUtils.loge("power down but downloadstaskbean table remain task");
}
}
}
}
public void updateDownloadTaskBeanTable() {
List<DownLoadTaskBean> list = DaoManager.getInstance().queryList(DownLoadTaskBean.class);
for (DownLoadTaskBean downLoadTaskBean:list) {
if(downLoadTaskBean.getCurrentProgress()==0&&!TextUtils.isEmpty(downLoadTaskBean.getUrl())&&!TextUtils.isEmpty(downLoadTaskBean.getFileName())&&!TextUtils.isEmpty(downLoadTaskBean.getPath())){
File file = new File(downLoadTaskBean.getPath()+downLoadTaskBean.getFileName()+"-tmp");
if(file.exists()&&file.length()>0&&file.length()<=downLoadTaskBean.getTotal()){
downLoadTaskBean.setCurrentProgress(file.length());
DaoManager.getInstance().update(DownLoadTaskBean.class,downLoadTaskBean);
}
}else if(downLoadTaskBean.getCurrentProgress()!=0&&!TextUtils.isEmpty(downLoadTaskBean.getUrl())&&!TextUtils.isEmpty(downLoadTaskBean.getFileName())&&!TextUtils.isEmpty(downLoadTaskBean.getPath())){
File file = new File(downLoadTaskBean.getPath()+downLoadTaskBean.getFileName()+"-tmp");
if(file.exists()&&file.length()>downLoadTaskBean.getCurrentProgress()&&file.length()<=downLoadTaskBean.getTotal()){
downLoadTaskBean.setCurrentProgress(file.length());
DaoManager.getInstance().update(DownLoadTaskBean.class,downLoadTaskBean);
}
}
}
}
public static class DownloadBuilder {//构造器
protected String url;//下载地址
protected String path;//下载路径
protected String name;//文件名字
protected long total;//现在总进度
/**文件类型*/
protected String minType;
/**任务类型*/
protected int taskType;
protected DownLoadTaskBean.DownLoadListener listener;//下载监听
public DownloadBuilder setMinType(String minType) {
this.minType = minType;
return this;
}
public DownloadBuilder url(String url) {
this.url = url;
return this;
}
public DownloadBuilder filePath(String path) {
this.path = path;
return this;
}
public DownloadBuilder listener(DownLoadTaskBean.DownLoadListener listener) {
this.listener = listener;
return this;
}
public DownloadBuilder fileName(String name) {
this.name = name;
return this;
}
public DownloadBuilder taskType(int taskType) {
this.taskType = taskType;
return this;
}
public DownloadBuilder fileTotal(long fileSize){
this.total =fileSize;
return this;
}
}
public interface DownloadListener{
public void onStart(DownLoadTaskBean bean, long taskId);
public void onError(DownLoadTaskBean bean, long taskId, String erroMsg);
public void onProgress(DownLoadTaskBean bean, long taskId, long progress);
public void onFinish(DownLoadTaskBean bean, long taskId);
}
//下载线程的观察者
private DownLoadTaskThread.DownloadTaskObserver observer = new DownLoadTaskThread.DownloadTaskObserver() {
@Override
protected void onStart(DownLoadTaskBean bean, long taskId) {//下载开始,回调总进度给监听,方便设置进度大小
LogUtils.loge("taskId=" + taskId + ">>>>>" + bean.getTotal());
bean.setStatus(0);
AppExecutors.getAppExecutors().mainThread().execute(() -> {//切换到主线程
if (bean.getListener() != null) {
bean.getListener().onStart(bean.getTotal());
}
});
}
@Override
protected void onProgress(DownLoadTaskBean bean, long taskId, long progress) {//进度调用
synchronized (this) {//这里必须加同步代码块,因为这共用进度等变量
if(mDownloadListener!=null){
mDownloadListener.onProgress(bean,taskId,progress);
}
}
}
@Override
protected void onFinish(DownLoadTaskBean bean, long taskId, long lastProgress) {
synchronized (this) {
LogUtils.loge("download Exception===>sleeping finish");
TaskQueue.getInstance().remove(bean);//单个任务完成删除
DaoManager.getInstance().delete(DownLoadTaskBean.class, bean);
if(mDownloadListener!=null){
mDownloadListener.onFinish(bean,taskId);
}
}
}
@Override
protected void onPause(DownLoadTaskBean bean, long taskId, long currentProgress) {
synchronized (this) {//暂停这里必须加上同步,不然会出现实际进度跟显示进度不一致问题,其实也就是缓存没存进去,第二个线程又来了
// DaoManager.getInstance().update(DownLoadTaskBean.class, bean);//更新数据库退出app再进来就不会从头下载
}
}
@Override
protected void onError(DownLoadTaskBean bean, long taskId, String erroMsg) {//错误提示
if(mDownloadListener!=null){
mDownloadListener.onError(bean,taskId,erroMsg);
TaskQueue.getInstance().remove(bean);
// DaoManager.getInstance().delete(DownLoadTaskBean.class, bean);//删除数据库缓存
}
}
};
public boolean checkTaskQueueClear(){
LogUtils.loge("checkTaskQueueClear() size="+TaskQueue.getInstance().getAllTask().size());
return TaskQueue.getInstance().size()==0;
}
}