Files
assistant-android/app/src/main/java/com/gh/download/DownloadManager.java
2016-09-04 18:35:43 +08:00

300 lines
8.1 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.gh.download;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v4.util.ArrayMap;
import android.widget.Toast;
import com.gh.common.constant.Constants;
import com.gh.common.util.FileUtils;
import com.gh.common.util.Utils;
import java.io.File;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.LinkedBlockingQueue;
public class DownloadManager {
private static DownloadManager mInstance;
private Context context;
private Handler handler;
private ArrayMap<String, Long> lastTimeMap;
private ArrayMap<String, LinkedBlockingQueue<String>> platformMap;
private DownloadManager(Context context) {
this.context = context;
lastTimeMap = new ArrayMap<>();
platformMap = new ArrayMap<>();
handler = new Handler(context.getMainLooper()){
@Override
public void handleMessage(Message msg) {
if (msg.what == Constants.CONTINUE_DOWNLOAD_TASK) {
String url = (String) msg.obj;
if (System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
resume(url);
}
} else if (msg.what == Constants.PAUSE_DOWNLOAD_TASK) {
String url = (String) msg.obj;
if (System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
pause(url);
}
} else if (msg.what == Constants.DOWNLOAD_ROLL) {
String name = (String) msg.obj;
LinkedBlockingQueue<String> queue = platformMap.get(name);
if (queue.size() > 1) {
queue.offer(queue.poll());
Message message = Message.obtain();
message.obj = name;
message.what = Constants.DOWNLOAD_ROLL;
sendMessageDelayed(message, 3000);
}
}
}
};
context.startService(new Intent(context, DownloadService.class));
}
public void put(String url, long time) {
lastTimeMap.put(url, time);
}
public void putQueue(String name, LinkedBlockingQueue<String> queue) {
platformMap.put(name, queue);
}
public LinkedBlockingQueue<String> getQueue(String name) {
return platformMap.get(name);
}
public void removePlatform(String name, String platform) {
LinkedBlockingQueue<String> queue = platformMap.get(name);
if (queue != null) {
queue.remove(platform);
platformMap.put(name, queue);
}
}
public void sendMessageDelayed(Message msg, long delayMillis) {
handler.sendMessageDelayed(msg, delayMillis);
}
public static DownloadManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new DownloadManager(context.getApplicationContext());
}
return mInstance;
}
private Intent getIntent(DownloadEntry entry, DownloadStatus status) {
Intent service = new Intent(context, DownloadService.class);
service.putExtra(Constants.KEY_DOWNLOAD_ENTRY, entry);
service.putExtra(Constants.KEY_DOWNLOAD_ACTION, status.name());
return service;
}
/**
* 根据url到本地sqlite数据库中查找并获取该文件的保存路径 并检查改路径下文件是否存在,不存在则删除该条无效记录
*
* @param url 下载任务的标识url
*/
private boolean checkDownloadEntryRecordValidate(String url) {
DownloadEntry entry = get(url);
if (entry != null && ((int)entry.getPercent()) != 0) {
File file = new File(entry.getPath());
if (!file.exists()) {
DownloadDao.getInstance(context).delete(url);
Utils.log(DownloadManager.class.getSimpleName(), "文件不存在,删除该条无效数据库记录!");
return true;
}
}
return false;
}
/**
* 检查任务是否已经下载完成
*
* @param url
* @return
*/
public boolean isFileCompleted(String url) {
DownloadEntry entry = get(url);
if (entry != null) {
if (entry.getPercent() == 100) {
Utils.log(DownloadManager.class.getSimpleName(), "文件已经下载完成!");
return true;
}
}
return false;
}
public boolean isTaskDownloading(String url) {
if (DataChanger.getInstance().getDownloadingTasks().get(url) != null) {
Utils.log(DownloadManager.class.getSimpleName(), url + "正在下载!");
return true;
}
return false;
}
/**
* 添加一个下载任务
*
* @param entry
*/
public void add(DownloadEntry entry) {
if (entry != null) {
String url = entry.getUrl();
checkDownloadEntryRecordValidate(url);
if (!isFileCompleted(url) && !isTaskDownloading(url)) {
context.startService(getIntent(entry, DownloadStatus.add));
}
}
Utils.log(DownloadManager.class.getSimpleName(), "add");
}
/**
* 根据任务url暂停下载
*
* @param url
*/
public void pause(String url) {
checkDownloadEntryRecordValidate(url);
DownloadEntry entry = DataChanger.getInstance().getDownloadEntries()
.get(url);
if (entry != null) {
context.startService(getIntent(entry, DownloadStatus.pause));
}
Utils.log(DownloadManager.class.getSimpleName(), "pause");
}
/**
* 根据url恢复下载
*
* @param url
*/
public void resume(String url) {
DownloadEntry entry = get(url);
// 暂停任务后,把文件删除,然后点继续,文件不存在,需要重新加入下载队列进行下载
if (checkDownloadEntryRecordValidate(url)) {
Toast.makeText(context, "文件不存在!已重新加入下载队列", Toast.LENGTH_SHORT)
.show();
add(entry);
} else {
if (entry != null) {
if (!isFileCompleted(url) && !isTaskDownloading(url)) {
context.startService(getIntent(entry, DownloadStatus.resume));
}
}
}
Utils.log(DownloadManager.class.getSimpleName(), "resume");
}
/**
* 根据url取消下载并删除已下载的文件
*
* @param url
*/
public void cancel(String url) {
cancel(url, true);
}
public void cancel(String url, boolean isDeleteFile) {
DownloadEntry temp = DownloadDao.getInstance(context).get(url);
if (temp != null) {
if (isDeleteFile) {
FileUtils.deleteFile(temp.getPath());
}
DownloadDao.getInstance(context).delete(url);
Utils.log(DownloadManager.class.getSimpleName(), "cancle==>file and record were deleted!");
}
DownloadEntry entry = DataChanger.getInstance().getDownloadEntries()
.get(url);
if (entry != null) {
context.startService(getIntent(entry, DownloadStatus.cancel));
Utils.log(DownloadManager.class.getSimpleName(), "cancel");
}
}
/**
* 取消并删除所有下载任务(包括下载中、等待、暂停状态的任务)
*/
public void cancleAll() {
for (Entry<String, DownloadEntry> entry : DataChanger.getInstance()
.getDownloadEntries().entrySet()) {
cancel(entry.getValue().getUrl(), true);
}
Utils.log(DownloadManager.class.getSimpleName(), "cancel all");
}
/**
* 开始所有下载任务
*/
public void startAll() {
for (Entry<String, DownloadEntry> entry : DataChanger.getInstance()
.getDownloadEntries().entrySet()) {
add(entry.getValue());
}
Utils.log(DownloadManager.class.getSimpleName(), "start all");
}
/**
* 暂停所有正在下载的任务
*/
public void pauseAll() {
for (Entry<String, DownloadEntry> entry : DataChanger.getInstance().getDownloadEntries().entrySet()) {
if (entry.getValue().getStatus() == DownloadStatus.downloading) {
pause(entry.getValue().getUrl());
}
}
Utils.log(DownloadManager.class.getSimpleName(), "pause all");
}
/**
* 根据url获取某一个下载任务
*
* @param url
* @return null表示下载列表中不存在该任务否则返回下载任务
*/
public DownloadEntry get(String url) {
return DownloadDao.getInstance(context).get(url);
}
/**
* 获取所有下载列表中的任务
*
* @return null表示没有下载任务
*/
public List<DownloadEntry> getAll() {
Utils.log(DownloadManager.class.getSimpleName(), "getAll");
return DownloadDao.getInstance(context).getAll();
}
public void addObserver(DataWatcher dataWatcher) {
DataChanger.getInstance().addObserver(dataWatcher);
Utils.log(DownloadManager.class.getSimpleName(), "addObserver");
}
public void removeObserver(DataWatcher dataWatcher) {
DataChanger.getInstance().deleteObserver(dataWatcher);
Utils.log(DownloadManager.class.getSimpleName(), "removeObserver");
}
public void removeObservers() {
DataChanger.getInstance().deleteObservers();
Utils.log(DownloadManager.class.getSimpleName(), "removeObserver");
}
}