最高优先级任务功能实现,demo修改
This commit is contained in:
@ -177,9 +177,9 @@ import com.arialyy.aria.core.upload.UploadTask;
|
|||||||
/**
|
/**
|
||||||
* 预处理,有时有些地址链接比较慢,这时可以先在这个地方出来一些界面上的UI,如按钮的状态。
|
* 预处理,有时有些地址链接比较慢,这时可以先在这个地方出来一些界面上的UI,如按钮的状态。
|
||||||
*
|
*
|
||||||
* @param url 任务上传地址
|
* @param task 上传文物实体
|
||||||
*/
|
*/
|
||||||
@Override public void onPre(String url) {
|
@Override public void onPre(UploadTask task) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,10 +223,11 @@ import com.arialyy.aria.core.upload.UploadTask;
|
|||||||
implements IDownloadSchedulerListener<DownloadTask> {
|
implements IDownloadSchedulerListener<DownloadTask> {
|
||||||
/**
|
/**
|
||||||
* 预处理,有时有些地址链接比较慢,这时可以先在这个地方出来一些界面上的UI,如按钮的状态。
|
* 预处理,有时有些地址链接比较慢,这时可以先在这个地方出来一些界面上的UI,如按钮的状态。
|
||||||
|
* 需要注意的是,在该回调中,是得不到文件长度的,如果需要获取文件长度,需要在onTaskPre中获取
|
||||||
*
|
*
|
||||||
* @param url 任务下载地址
|
* @param task 下载任务
|
||||||
*/
|
*/
|
||||||
@Override public void onPre(String url) {
|
@Override public void onPre(DownloadTask task) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ final class HighestPriorityCmd<T extends ITaskEntity> extends AbsCmd<T> {
|
|||||||
if (!TextUtils.isEmpty(mTargetName)) {
|
if (!TextUtils.isEmpty(mTargetName)) {
|
||||||
task.setTargetName(mTargetName);
|
task.setTargetName(mTargetName);
|
||||||
}
|
}
|
||||||
task.setHighestPriority(true);
|
mQueue.setTaskHighestPriority(task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ public class DownloadTask implements ITask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return 返回转换单位后的速度,需要你在配置文件中配置,转换完成后为:1b/s、1k/s、1m/s、1g/s、1t/s
|
* @return 返回转换单位后的速度,需要你在配置文件中配置,转换完成后为:1b/s、1kb/s、1mb/s、1gb/s、1tb/s
|
||||||
* <pre>
|
* <pre>
|
||||||
* {@code
|
* {@code
|
||||||
* <xml>
|
* <xml>
|
||||||
@ -118,11 +118,11 @@ public class DownloadTask implements ITask {
|
|||||||
/**
|
/**
|
||||||
* 转换单位后的文件长度
|
* 转换单位后的文件长度
|
||||||
*
|
*
|
||||||
* @return 如果文件长度为0,则返回0m,否则返回转换后的长度1b、1k、1m、1g、1t
|
* @return 如果文件长度为0,则返回0m,否则返回转换后的长度1b、1kb、1mb、1gb、1tb
|
||||||
*/
|
*/
|
||||||
@Override public String getConvertFileSize() {
|
@Override public String getConvertFileSize() {
|
||||||
if (mEntity.getFileSize() == 0) {
|
if (mEntity.getFileSize() == 0) {
|
||||||
return "0m";
|
return "0mb";
|
||||||
}
|
}
|
||||||
return CommonUtil.formatFileSize(mEntity.getFileSize());
|
return CommonUtil.formatFileSize(mEntity.getFileSize());
|
||||||
}
|
}
|
||||||
@ -134,6 +134,18 @@ public class DownloadTask implements ITask {
|
|||||||
return mEntity.getCurrentProgress();
|
return mEntity.getCurrentProgress();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取单位转换后的进度
|
||||||
|
*
|
||||||
|
* @return 如:已经下载3mb的大小,则返回{@code 3mb}
|
||||||
|
*/
|
||||||
|
@Override public String getConvertCurrentProgress() {
|
||||||
|
if (mEntity.getCurrentProgress() == 0) {
|
||||||
|
return "0b";
|
||||||
|
}
|
||||||
|
return CommonUtil.formatFileSize(mEntity.getCurrentProgress());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前下载任务的下载地址
|
* 获取当前下载任务的下载地址
|
||||||
*
|
*
|
||||||
|
@ -35,11 +35,20 @@ import java.util.Set;
|
|||||||
/**
|
/**
|
||||||
* Created by lyy on 2017/2/28.
|
* Created by lyy on 2017/2/28.
|
||||||
*/
|
*/
|
||||||
public class AbsTarget<ENTITY extends IEntity, TASK_ENTITY extends ITaskEntity> {
|
public abstract class AbsTarget<ENTITY extends IEntity, TASK_ENTITY extends ITaskEntity> {
|
||||||
protected ENTITY entity;
|
protected ENTITY entity;
|
||||||
protected TASK_ENTITY taskEntity;
|
protected TASK_ENTITY taskEntity;
|
||||||
protected String targetName;
|
protected String targetName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取任务状态
|
||||||
|
*
|
||||||
|
* @return {@link IEntity}
|
||||||
|
*/
|
||||||
|
public int getTaskState() {
|
||||||
|
return entity.getState();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将任务设置为最高优先级任务,最高优先级任务有以下特点:
|
* 将任务设置为最高优先级任务,最高优先级任务有以下特点:
|
||||||
* 1、在下载队列中,有且只有一个最高优先级任务
|
* 1、在下载队列中,有且只有一个最高优先级任务
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
package com.arialyy.aria.core.inf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by lyy on 2017/6/3.
|
||||||
|
*/
|
||||||
|
public abstract class AbsTask implements ITask{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -81,8 +81,17 @@ public interface ITask {
|
|||||||
*/
|
*/
|
||||||
public String getConvertFileSize();
|
public String getConvertFileSize();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前进度
|
||||||
|
*/
|
||||||
public long getCurrentProgress();
|
public long getCurrentProgress();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取单位转换后的进度
|
||||||
|
* @return 返回 3mb
|
||||||
|
*/
|
||||||
|
public String getConvertCurrentProgress();
|
||||||
|
|
||||||
public void setTargetName(String targetName);
|
public void setTargetName(String targetName);
|
||||||
|
|
||||||
public void removeRecord();
|
public void removeRecord();
|
||||||
|
@ -87,6 +87,7 @@ abstract class AbsTaskQueue<TASK extends ITask, TASK_ENTITY extends ITaskEntity,
|
|||||||
|
|
||||||
@Override public void stopTask(TASK task) {
|
@Override public void stopTask(TASK task) {
|
||||||
if (!task.isRunning()) Log.w(TAG, "停止任务失败,【任务已经停止】");
|
if (!task.isRunning()) Log.w(TAG, "停止任务失败,【任务已经停止】");
|
||||||
|
task.setHighestPriority(false);
|
||||||
if (mExecutePool.removeTask(task)) {
|
if (mExecutePool.removeTask(task)) {
|
||||||
task.stop();
|
task.stop();
|
||||||
} else {
|
} else {
|
||||||
|
@ -26,6 +26,7 @@ import com.arialyy.aria.core.inf.IEntity;
|
|||||||
import com.arialyy.aria.core.queue.pool.ExecutePool;
|
import com.arialyy.aria.core.queue.pool.ExecutePool;
|
||||||
import com.arialyy.aria.core.scheduler.DownloadSchedulers;
|
import com.arialyy.aria.core.scheduler.DownloadSchedulers;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,6 +53,20 @@ public class DownloadTaskQueue
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public void setTaskHighestPriority(DownloadTask task) {
|
@Override public void setTaskHighestPriority(DownloadTask task) {
|
||||||
|
task.setHighestPriority(true);
|
||||||
|
Map<String, DownloadTask> exeTasks = mExecutePool.getAllTask();
|
||||||
|
if (exeTasks != null && !exeTasks.isEmpty()) {
|
||||||
|
Set<String> keys = exeTasks.keySet();
|
||||||
|
for (String key : keys) {
|
||||||
|
DownloadTask temp = exeTasks.get(key);
|
||||||
|
if (temp != null && temp.isRunning() && temp.isHighestPriorityTask() && !temp.getKey()
|
||||||
|
.equals(task.getKey())) {
|
||||||
|
Log.e(TAG, "设置最高优先级任务失败,失败原因【任务中已经有最高优先级任务,请等待上一个最高优先级任务完成,或手动暂停该任务】");
|
||||||
|
task.setHighestPriority(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
int maxSize = AriaManager.getInstance(AriaManager.APP).getDownloadConfig().getMaxTaskNum();
|
int maxSize = AriaManager.getInstance(AriaManager.APP).getDownloadConfig().getMaxTaskNum();
|
||||||
int currentSize = mExecutePool.size();
|
int currentSize = mExecutePool.size();
|
||||||
if (currentSize == 0 || currentSize < maxSize) {
|
if (currentSize == 0 || currentSize < maxSize) {
|
||||||
|
@ -34,12 +34,19 @@ public class CachePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
private static final Object LOCK = new Object();
|
private static final Object LOCK = new Object();
|
||||||
private static final int MAX_NUM = Integer.MAX_VALUE; //最大下载任务数
|
private static final int MAX_NUM = Integer.MAX_VALUE; //最大下载任务数
|
||||||
private static final long TIME_OUT = 1000;
|
private static final long TIME_OUT = 1000;
|
||||||
private Map<String, TASK> mCacheArray;
|
private Map<String, TASK> mCacheMap;
|
||||||
private LinkedBlockingQueue<TASK> mCacheQueue;
|
private LinkedBlockingQueue<TASK> mCacheQueue;
|
||||||
|
|
||||||
public CachePool() {
|
public CachePool() {
|
||||||
mCacheQueue = new LinkedBlockingQueue<>(MAX_NUM);
|
mCacheQueue = new LinkedBlockingQueue<>(MAX_NUM);
|
||||||
mCacheArray = new HashMap<>();
|
mCacheMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有正在执行的任务
|
||||||
|
*/
|
||||||
|
public Map<String, TASK> getAllTask() {
|
||||||
|
return mCacheMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean putTask(TASK task) {
|
@Override public boolean putTask(TASK task) {
|
||||||
@ -56,7 +63,7 @@ public class CachePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
boolean s = mCacheQueue.offer(task);
|
boolean s = mCacheQueue.offer(task);
|
||||||
Log.d(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】"));
|
Log.d(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】"));
|
||||||
if (s) {
|
if (s) {
|
||||||
mCacheArray.put(CommonUtil.keyToHashKey(url), task);
|
mCacheMap.put(CommonUtil.keyToHashKey(url), task);
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -70,7 +77,7 @@ public class CachePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
task = mCacheQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
|
task = mCacheQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
|
||||||
if (task != null) {
|
if (task != null) {
|
||||||
String url = task.getKey();
|
String url = task.getKey();
|
||||||
mCacheArray.remove(CommonUtil.keyToHashKey(url));
|
mCacheMap.remove(CommonUtil.keyToHashKey(url));
|
||||||
}
|
}
|
||||||
return task;
|
return task;
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
@ -87,7 +94,7 @@ public class CachePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String key = CommonUtil.keyToHashKey(downloadUrl);
|
String key = CommonUtil.keyToHashKey(downloadUrl);
|
||||||
return mCacheArray.get(key);
|
return mCacheMap.get(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,7 +105,7 @@ public class CachePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
String key = CommonUtil.keyToHashKey(task.getKey());
|
String key = CommonUtil.keyToHashKey(task.getKey());
|
||||||
mCacheArray.remove(key);
|
mCacheMap.remove(key);
|
||||||
return mCacheQueue.remove(task);
|
return mCacheQueue.remove(task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -111,8 +118,8 @@ public class CachePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String key = CommonUtil.keyToHashKey(downloadUrl);
|
String key = CommonUtil.keyToHashKey(downloadUrl);
|
||||||
TASK task = mCacheArray.get(key);
|
TASK task = mCacheMap.get(key);
|
||||||
mCacheArray.remove(key);
|
mCacheMap.remove(key);
|
||||||
return mCacheQueue.remove(task);
|
return mCacheQueue.remove(task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import com.arialyy.aria.core.inf.ITask;
|
|||||||
import com.arialyy.aria.util.CommonUtil;
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@ -35,7 +36,7 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
private static final Object LOCK = new Object();
|
private static final Object LOCK = new Object();
|
||||||
private static final long TIME_OUT = 1000;
|
private static final long TIME_OUT = 1000;
|
||||||
private ArrayBlockingQueue<TASK> mExecuteQueue;
|
private ArrayBlockingQueue<TASK> mExecuteQueue;
|
||||||
private Map<String, TASK> mExecuteArray;
|
private Map<String, TASK> mExecuteMap;
|
||||||
private int mSize;
|
private int mSize;
|
||||||
|
|
||||||
public ExecutePool(boolean isDownload) {
|
public ExecutePool(boolean isDownload) {
|
||||||
@ -45,7 +46,14 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
mSize = AriaManager.getInstance(AriaManager.APP).getUploadConfig().getMaxTaskNum();
|
mSize = AriaManager.getInstance(AriaManager.APP).getUploadConfig().getMaxTaskNum();
|
||||||
}
|
}
|
||||||
mExecuteQueue = new ArrayBlockingQueue<>(mSize);
|
mExecuteQueue = new ArrayBlockingQueue<>(mSize);
|
||||||
mExecuteArray = new HashMap<>();
|
mExecuteMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有正在执行的任务
|
||||||
|
*/
|
||||||
|
public Map<String, TASK> getAllTask() {
|
||||||
|
return mExecuteMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean putTask(TASK task) {
|
@Override public boolean putTask(TASK task) {
|
||||||
@ -60,6 +68,10 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
if (mExecuteQueue.size() >= mSize) {
|
if (mExecuteQueue.size() >= mSize) {
|
||||||
|
Set<String> keys = mExecuteMap.keySet();
|
||||||
|
for (String key : keys) {
|
||||||
|
if (mExecuteMap.get(key).isHighestPriorityTask()) return false;
|
||||||
|
}
|
||||||
if (pollFirstTask()) {
|
if (pollFirstTask()) {
|
||||||
return putNewTask(task);
|
return putNewTask(task);
|
||||||
}
|
}
|
||||||
@ -100,7 +112,7 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
boolean s = mExecuteQueue.offer(newTask);
|
boolean s = mExecuteQueue.offer(newTask);
|
||||||
Log.w(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】"));
|
Log.w(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】"));
|
||||||
if (s) {
|
if (s) {
|
||||||
mExecuteArray.put(CommonUtil.keyToHashKey(url), newTask);
|
mExecuteMap.put(CommonUtil.keyToHashKey(url), newTask);
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -120,7 +132,7 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
}
|
}
|
||||||
oldTask.stop();
|
oldTask.stop();
|
||||||
String key = CommonUtil.keyToHashKey(oldTask.getKey());
|
String key = CommonUtil.keyToHashKey(oldTask.getKey());
|
||||||
mExecuteArray.remove(key);
|
mExecuteMap.remove(key);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return false;
|
||||||
@ -135,7 +147,7 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
task = mExecuteQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
|
task = mExecuteQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
|
||||||
if (task != null) {
|
if (task != null) {
|
||||||
String url = task.getKey();
|
String url = task.getKey();
|
||||||
mExecuteArray.remove(CommonUtil.keyToHashKey(url));
|
mExecuteMap.remove(CommonUtil.keyToHashKey(url));
|
||||||
}
|
}
|
||||||
return task;
|
return task;
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
@ -152,7 +164,7 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String key = CommonUtil.keyToHashKey(downloadUrl);
|
String key = CommonUtil.keyToHashKey(downloadUrl);
|
||||||
return mExecuteArray.get(key);
|
return mExecuteMap.get(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +175,7 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
String key = CommonUtil.keyToHashKey(task.getKey());
|
String key = CommonUtil.keyToHashKey(task.getKey());
|
||||||
mExecuteArray.remove(key);
|
mExecuteMap.remove(key);
|
||||||
return mExecuteQueue.remove(task);
|
return mExecuteQueue.remove(task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -176,8 +188,8 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String key = CommonUtil.keyToHashKey(downloadUrl);
|
String key = CommonUtil.keyToHashKey(downloadUrl);
|
||||||
TASK task = mExecuteArray.get(key);
|
TASK task = mExecuteMap.get(key);
|
||||||
mExecuteArray.remove(key);
|
mExecuteMap.remove(key);
|
||||||
return mExecuteQueue.remove(task);
|
return mExecuteQueue.remove(task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,7 @@ public class DownloadSchedulers implements ISchedulers<DownloadTask> {
|
|||||||
}
|
}
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PRE:
|
case PRE:
|
||||||
listener.onPre(task.getKey());
|
listener.onPre(task);
|
||||||
break;
|
break;
|
||||||
case POST_PRE:
|
case POST_PRE:
|
||||||
listener.onTaskPre(task);
|
listener.onTaskPre(task);
|
||||||
|
@ -25,7 +25,7 @@ public interface ISchedulerListener<TASK extends ITask> {
|
|||||||
* 预处理,有时有些地址链接比较慢,这时可以先在这个地方出来一些界面上的UI,如按钮的状态。
|
* 预处理,有时有些地址链接比较慢,这时可以先在这个地方出来一些界面上的UI,如按钮的状态。
|
||||||
* 在这个回调中,任务是获取不到文件大小,下载速度等参数
|
* 在这个回调中,任务是获取不到文件大小,下载速度等参数
|
||||||
*/
|
*/
|
||||||
public void onPre(String url);
|
public void onPre(TASK task);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 任务预加载完成
|
* 任务预加载完成
|
||||||
|
@ -132,7 +132,7 @@ public class UploadSchedulers implements ISchedulers<UploadTask> {
|
|||||||
}
|
}
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PRE:
|
case PRE:
|
||||||
listener.onPre(task.getKey());
|
listener.onPre(task);
|
||||||
break;
|
break;
|
||||||
case POST_PRE:
|
case POST_PRE:
|
||||||
listener.onTaskPre(task);
|
listener.onTaskPre(task);
|
||||||
|
@ -139,7 +139,7 @@ public class UploadTask implements ITask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return 返回转换单位后的速度,需要你在配置文件中配置,转换完成后为:1b/s、1k/s、1m/s、1g/s、1t/s
|
* @return 返回转换单位后的速度,需要你在配置文件中配置,转换完成后为:1b/s、1kb/s、1mb/s、1gb/s、1tb/s
|
||||||
* <pre>
|
* <pre>
|
||||||
* {@code
|
* {@code
|
||||||
* <xml>
|
* <xml>
|
||||||
@ -175,7 +175,7 @@ public class UploadTask implements ITask {
|
|||||||
/**
|
/**
|
||||||
* 转换单位后的文件长度
|
* 转换单位后的文件长度
|
||||||
*
|
*
|
||||||
* @return 如果文件长度为0,则返回0m,否则返回转换后的长度1b、1k、1m、1g、1t
|
* @return 如果文件长度为0,则返回0m,否则返回转换后的长度1b、1kb、1mb、1gb、1tb
|
||||||
*/
|
*/
|
||||||
@Override public String getConvertFileSize() {
|
@Override public String getConvertFileSize() {
|
||||||
if (mUploadEntity.getFileSize() == 0) {
|
if (mUploadEntity.getFileSize() == 0) {
|
||||||
@ -192,6 +192,18 @@ public class UploadTask implements ITask {
|
|||||||
return mUploadEntity.getCurrentProgress();
|
return mUploadEntity.getCurrentProgress();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取单位转换后的进度
|
||||||
|
*
|
||||||
|
* @return 如:已经下载3mb的大小,则返回{@code 3mb}
|
||||||
|
*/
|
||||||
|
@Override public String getConvertCurrentProgress() {
|
||||||
|
if (mUploadEntity.getCurrentProgress() == 0) {
|
||||||
|
return "0b";
|
||||||
|
}
|
||||||
|
return CommonUtil.formatFileSize(mUploadEntity.getCurrentProgress());
|
||||||
|
}
|
||||||
|
|
||||||
private static class UListener extends UploadListener {
|
private static class UListener extends UploadListener {
|
||||||
WeakReference<Handler> outHandler;
|
WeakReference<Handler> outHandler;
|
||||||
WeakReference<UploadTask> task;
|
WeakReference<UploadTask> task;
|
||||||
|
@ -207,22 +207,22 @@ public class CommonUtil {
|
|||||||
double megaByte = kiloByte / 1024;
|
double megaByte = kiloByte / 1024;
|
||||||
if (megaByte < 1) {
|
if (megaByte < 1) {
|
||||||
BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
|
BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
|
||||||
return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "k";
|
return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "kb";
|
||||||
}
|
}
|
||||||
|
|
||||||
double gigaByte = megaByte / 1024;
|
double gigaByte = megaByte / 1024;
|
||||||
if (gigaByte < 1) {
|
if (gigaByte < 1) {
|
||||||
BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
|
BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
|
||||||
return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "m";
|
return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "mb";
|
||||||
}
|
}
|
||||||
|
|
||||||
double teraBytes = gigaByte / 1024;
|
double teraBytes = gigaByte / 1024;
|
||||||
if (teraBytes < 1) {
|
if (teraBytes < 1) {
|
||||||
BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
|
BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
|
||||||
return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "g";
|
return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "gb";
|
||||||
}
|
}
|
||||||
BigDecimal result4 = new BigDecimal(teraBytes);
|
BigDecimal result4 = new BigDecimal(teraBytes);
|
||||||
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "t";
|
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "tb";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,7 +17,6 @@ package com.arialyy.aria.util;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import com.arialyy.aria.window.FileEntity;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
@ -27,8 +26,6 @@ import java.io.InputStream;
|
|||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by lyy on 2017/3/21.
|
* Created by lyy on 2017/3/21.
|
||||||
@ -138,21 +135,4 @@ public class FileUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 文件列表
|
|
||||||
*/
|
|
||||||
public List<FileEntity> loadFiles(String path) {
|
|
||||||
File file = new File(path);
|
|
||||||
File[] files = file.listFiles();
|
|
||||||
List<FileEntity> list = new ArrayList<>();
|
|
||||||
for (File f : files) {
|
|
||||||
FileEntity entity = new FileEntity();
|
|
||||||
entity.fileName = f.getName();
|
|
||||||
//entity.fileInfo = getFileType(f.getPath());
|
|
||||||
//entity.fileDrawable = getApkIcon(mContext, f.getPath());
|
|
||||||
list.add(entity);
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.arialyy.aria.window;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Environment;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v4.app.FragmentActivity;
|
|
||||||
import android.widget.AbsListView;
|
|
||||||
import android.widget.ListView;
|
|
||||||
import com.arialyy.aria.R;
|
|
||||||
import com.arialyy.aria.util.FileUtil;
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by lyy on 2017/3/21.
|
|
||||||
* 文件选择
|
|
||||||
*/
|
|
||||||
class AriaFileChangeActivity extends FragmentActivity {
|
|
||||||
final String ROOT_PAT = Environment.getExternalStorageDirectory().getPath();
|
|
||||||
ListView mList;
|
|
||||||
FileChangeAdapter mAdapter;
|
|
||||||
Map<String, List<FileEntity>> mData = new HashMap<>();
|
|
||||||
private String mCurrentPath = ROOT_PAT;
|
|
||||||
|
|
||||||
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.activity_aria_file_shange);
|
|
||||||
mList = (ListView) findViewById(R.id.list);
|
|
||||||
mList.setOnScrollListener(new AbsListView.OnScrollListener() {
|
|
||||||
int state;
|
|
||||||
|
|
||||||
@Override public void onScrollStateChanged(AbsListView view, int scrollState) {
|
|
||||||
state = scrollState;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
|
|
||||||
int totalItemCount) {
|
|
||||||
if (state == AbsListView.OnScrollListener.SCROLL_STATE_IDLE
|
|
||||||
&& firstVisibleItem + visibleItemCount == totalItemCount) {
|
|
||||||
loadMore();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadMore() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,92 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.arialyy.aria.window;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.SparseBooleanArray;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.arialyy.aria.R;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by lyy on 2017/3/21.
|
|
||||||
*/
|
|
||||||
final class FileChangeAdapter extends BaseAdapter {
|
|
||||||
|
|
||||||
List<FileEntity> mData = new ArrayList<>();
|
|
||||||
SparseBooleanArray mCheck = new SparseBooleanArray();
|
|
||||||
Context mContext;
|
|
||||||
|
|
||||||
public FileChangeAdapter(Context context, List<FileEntity> list) {
|
|
||||||
mContext = context;
|
|
||||||
mData.addAll(list);
|
|
||||||
for (int i = 0, len = mData.size(); i < len; i++) {
|
|
||||||
mCheck.append(i, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override public int getCount() {
|
|
||||||
return mData.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override public Object getItem(int position) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override public long getItemId(int position) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override public View getView(int position, View convertView, ViewGroup parent) {
|
|
||||||
FileChangeHolder holder = null;
|
|
||||||
if (convertView == null) {
|
|
||||||
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_file, null);
|
|
||||||
holder = new FileChangeHolder(convertView);
|
|
||||||
convertView.setTag(holder);
|
|
||||||
} else {
|
|
||||||
holder = (FileChangeHolder) convertView.getTag();
|
|
||||||
}
|
|
||||||
|
|
||||||
holder.checkBox.setChecked(mCheck.get(position, false));
|
|
||||||
return convertView;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCheck(int position, boolean check) {
|
|
||||||
if (position >= mData.size()) return;
|
|
||||||
mCheck.put(position, check);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class FileChangeHolder {
|
|
||||||
TextView title, info;
|
|
||||||
ImageView icon;
|
|
||||||
CheckBox checkBox;
|
|
||||||
|
|
||||||
FileChangeHolder(View view) {
|
|
||||||
title = (TextView) view.findViewById(R.id.title);
|
|
||||||
info = (TextView) view.findViewById(R.id.info);
|
|
||||||
icon = (ImageView) view.findViewById(R.id.icon);
|
|
||||||
checkBox = (CheckBox) view.findViewById(R.id.checkbox);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.arialyy.aria.window;
|
|
||||||
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by lyy on 2017/3/21.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class FileEntity {
|
|
||||||
public String fileName;
|
|
||||||
public String fileInfo;
|
|
||||||
public int fileIcon;
|
|
||||||
public Drawable fileDrawable;
|
|
||||||
}
|
|
@ -158,7 +158,7 @@ compile 'com.arialyy.aria:Aria:3.1.4'
|
|||||||
<!--设置https ca 证书信息;path 为assets目录下的CA证书完整路径,name 为CA证书名-->
|
<!--设置https ca 证书信息;path 为assets目录下的CA证书完整路径,name 为CA证书名-->
|
||||||
<ca name="" path=""/>
|
<ca name="" path=""/>
|
||||||
|
|
||||||
<!--是否需要转换速度单位,转换完成后为:1b/s、1k/s、1m/s、1g/s、1t/s,如果不需要将返回byte长度-->
|
<!--是否需要转换速度单位,转换完成后为:1b/s、1kb/s、1mb/s、1gb/s、1tb/s,如果不需要将返回byte长度-->
|
||||||
<cnvertSpeed value="false"/>
|
<cnvertSpeed value="false"/>
|
||||||
|
|
||||||
</download>
|
</download>
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
<activity android:name=".download.multi_download.MultiTaskActivity"/>
|
<activity android:name=".download.multi_download.MultiTaskActivity"/>
|
||||||
<activity android:name=".download.fragment_download.FragmentActivity"/>
|
<activity android:name=".download.fragment_download.FragmentActivity"/>
|
||||||
<activity android:name=".download.multi_download.MultiDownloadActivity"/>
|
<activity android:name=".download.multi_download.MultiDownloadActivity"/>
|
||||||
|
<activity android:name=".download.HighestPriorityActivity"/>
|
||||||
|
|
||||||
<service android:name=".download.service_download.DownloadService"/>
|
<service android:name=".download.service_download.DownloadService"/>
|
||||||
</application>
|
</application>
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
<!--设置https ca 证书信息;path 为assets目录下的CA证书完整路径,name 为CA证书名-->
|
<!--设置https ca 证书信息;path 为assets目录下的CA证书完整路径,name 为CA证书名-->
|
||||||
<ca name="" path=""/>
|
<ca name="" path=""/>
|
||||||
|
|
||||||
<!--是否需要转换速度单位,转换完成后为:1b/s、1k/s、1m/s、1g/s、1t/s,如果不需要将返回byte长度-->
|
<!--是否需要转换速度单位,转换完成后为:1b/s、1kb/s、1mb/s、1gb/s、1tb/s,如果不需要将返回byte长度-->
|
||||||
<convertSpeed value="true"/>
|
<convertSpeed value="true"/>
|
||||||
|
|
||||||
</download>
|
</download>
|
||||||
|
@ -33,11 +33,11 @@ import com.arialyy.simple.upload.UploadActivity;
|
|||||||
*/
|
*/
|
||||||
public class MainActivity extends BaseActivity<ActivityMainBinding> {
|
public class MainActivity extends BaseActivity<ActivityMainBinding> {
|
||||||
|
|
||||||
@Bind(R.id.toolbar) Toolbar mBar;
|
|
||||||
|
|
||||||
@Override protected void init(Bundle savedInstanceState) {
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
super.init(savedInstanceState);
|
super.init(savedInstanceState);
|
||||||
|
setSupportActionBar(mBar);
|
||||||
mBar.setTitle("Aria Demo");
|
mBar.setTitle("Aria Demo");
|
||||||
|
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override protected int setLayoutId() {
|
@Override protected int setLayoutId() {
|
||||||
|
@ -18,15 +18,21 @@ package com.arialyy.simple.base;
|
|||||||
|
|
||||||
import android.databinding.ViewDataBinding;
|
import android.databinding.ViewDataBinding;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.PersistableBundle;
|
import android.support.v7.widget.Toolbar;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import butterknife.Bind;
|
||||||
import com.arialyy.frame.core.AbsActivity;
|
import com.arialyy.frame.core.AbsActivity;
|
||||||
import com.arialyy.frame.util.AndroidVersionUtil;
|
import com.arialyy.frame.util.AndroidVersionUtil;
|
||||||
import com.arialyy.simple.R;
|
import com.arialyy.simple.R;
|
||||||
|
import com.arialyy.simple.common.MsgDialog;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Lyy on 2016/9/27.
|
* Created by Lyy on 2016/9/27.
|
||||||
*/
|
*/
|
||||||
public abstract class BaseActivity<VB extends ViewDataBinding> extends AbsActivity<VB> {
|
public abstract class BaseActivity<VB extends ViewDataBinding> extends AbsActivity<VB>
|
||||||
|
implements Toolbar.OnMenuItemClickListener {
|
||||||
|
|
||||||
|
@Bind(R.id.toolbar) protected Toolbar mBar;
|
||||||
|
|
||||||
@Override protected void onCreate(Bundle savedInstanceState) {
|
@Override protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -35,11 +41,36 @@ public abstract class BaseActivity<VB extends ViewDataBinding> extends AbsActivi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
|
super.init(savedInstanceState);
|
||||||
|
setSupportActionBar(mBar);
|
||||||
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
mBar.setOnMenuItemClickListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setTile(String title){
|
||||||
|
mBar.setTitle(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void showMsgDialog(String title, String msg){
|
||||||
|
MsgDialog dialog = new MsgDialog(this, title, msg);
|
||||||
|
dialog.show(getSupportFragmentManager(), "msg_dialog");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public boolean onMenuItemClick(MenuItem item) {
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
if (item.getItemId() == android.R.id.home) {
|
||||||
|
finish();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
@Override protected void dataCallback(int result, Object data) {
|
@Override protected void dataCallback(int result, Object data) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override protected void init(Bundle savedInstanceState) {
|
|
||||||
super.init(savedInstanceState);
|
|
||||||
}
|
|
||||||
}
|
}
|
38
app/src/main/java/com/arialyy/simple/common/MsgDialog.java
Normal file
38
app/src/main/java/com/arialyy/simple/common/MsgDialog.java
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package com.arialyy.simple.common;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import butterknife.OnClick;
|
||||||
|
import com.arialyy.frame.util.show.T;
|
||||||
|
import com.arialyy.simple.R;
|
||||||
|
import com.arialyy.simple.base.BaseDialog;
|
||||||
|
import com.arialyy.simple.databinding.DialogMsgBinding;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by AriaL on 2017/6/3.
|
||||||
|
*/
|
||||||
|
@SuppressLint("ValidFragment") public class MsgDialog extends BaseDialog<DialogMsgBinding> {
|
||||||
|
|
||||||
|
private String mTitle, mMsg;
|
||||||
|
|
||||||
|
public MsgDialog(Object obj, String title, String msg) {
|
||||||
|
super(obj);
|
||||||
|
mTitle = title;
|
||||||
|
mMsg = msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
|
super.init(savedInstanceState);
|
||||||
|
getBinding().setTitle(mTitle);
|
||||||
|
getBinding().setMsg(mMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected int setLayoutId() {
|
||||||
|
return R.layout.dialog_msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick(R.id.enter)
|
||||||
|
public void close(){
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
}
|
@ -39,7 +39,6 @@ import com.arialyy.simple.download.service_download.DownloadService;
|
|||||||
* Created by Lyy on 2016/10/13.
|
* Created by Lyy on 2016/10/13.
|
||||||
*/
|
*/
|
||||||
public class DownloadActivity extends BaseActivity<ActivityDownloadMeanBinding> {
|
public class DownloadActivity extends BaseActivity<ActivityDownloadMeanBinding> {
|
||||||
@Bind(R.id.toolbar) Toolbar mBar;
|
|
||||||
@Bind(R.id.single_task) Button mSigleBt;
|
@Bind(R.id.single_task) Button mSigleBt;
|
||||||
@Bind(R.id.multi_task) Button mMultiBt;
|
@Bind(R.id.multi_task) Button mMultiBt;
|
||||||
@Bind(R.id.dialog_task) Button mDialogBt;
|
@Bind(R.id.dialog_task) Button mDialogBt;
|
||||||
@ -51,8 +50,7 @@ public class DownloadActivity extends BaseActivity<ActivityDownloadMeanBinding>
|
|||||||
|
|
||||||
@Override protected void init(Bundle savedInstanceState) {
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
super.init(savedInstanceState);
|
super.init(savedInstanceState);
|
||||||
setSupportActionBar(mBar);
|
setTitle("Aria下载");
|
||||||
mBar.setTitle("多线程多任务下载");
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||||
setEnable(true);
|
setEnable(true);
|
||||||
} else { //6.0处理
|
} else { //6.0处理
|
||||||
@ -85,6 +83,9 @@ public class DownloadActivity extends BaseActivity<ActivityDownloadMeanBinding>
|
|||||||
|
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
switch (view.getId()) {
|
switch (view.getId()) {
|
||||||
|
case R.id.highest_priority:
|
||||||
|
startActivity(new Intent(this, HighestPriorityActivity.class));
|
||||||
|
break;
|
||||||
case R.id.service:
|
case R.id.service:
|
||||||
startService(new Intent(this, DownloadService.class));
|
startService(new Intent(this, DownloadService.class));
|
||||||
break;
|
break;
|
||||||
@ -100,7 +101,6 @@ public class DownloadActivity extends BaseActivity<ActivityDownloadMeanBinding>
|
|||||||
break;
|
break;
|
||||||
case R.id.pop_task:
|
case R.id.pop_task:
|
||||||
DownloadPopupWindow pop = new DownloadPopupWindow(this);
|
DownloadPopupWindow pop = new DownloadPopupWindow(this);
|
||||||
//pop.showAsDropDown(mRootView);
|
|
||||||
pop.showAtLocation(mRootView, Gravity.CENTER_VERTICAL, 0, 0);
|
pop.showAtLocation(mRootView, Gravity.CENTER_VERTICAL, 0, 0);
|
||||||
break;
|
break;
|
||||||
case R.id.fragment_task:
|
case R.id.fragment_task:
|
||||||
|
@ -20,6 +20,7 @@ import android.content.BroadcastReceiver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import com.arialyy.aria.core.Aria;
|
import com.arialyy.aria.core.Aria;
|
||||||
@ -33,6 +34,7 @@ import com.arialyy.simple.download.multi_download.FileListEntity;
|
|||||||
import com.arialyy.simple.base.BaseModule;
|
import com.arialyy.simple.base.BaseModule;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
@ -40,39 +42,29 @@ import java.util.Random;
|
|||||||
* Created by Lyy on 2016/9/27.
|
* Created by Lyy on 2016/9/27.
|
||||||
*/
|
*/
|
||||||
public class DownloadModule extends BaseModule {
|
public class DownloadModule extends BaseModule {
|
||||||
private List<String> mTestDownloadUrl = new ArrayList<>();
|
|
||||||
|
|
||||||
public DownloadModule(Context context) {
|
public DownloadModule(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
mTestDownloadUrl.add(
|
|
||||||
"http://static.gaoshouyou.com/d/e6/f5/4de6329f9cf5dc3a1d1e6bbcca0d003c.apk");
|
|
||||||
mTestDownloadUrl.add(
|
|
||||||
"http://static.gaoshouyou.com/d/6e/e5/ff6ecaaf45e532e6d07747af82357472.apk");
|
|
||||||
mTestDownloadUrl.add(
|
|
||||||
"http://static.gaoshouyou.com/d/36/69/2d3699acfa69e9632262442c46516ad8.apk");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取下载列表
|
* 最高优先级任务测试列表
|
||||||
*/
|
*/
|
||||||
public List<DownloadEntity> getDownloadTaskList() {
|
public List<DownloadEntity> getHighestTestList() {
|
||||||
return Aria.download(getContext()).getTaskList();
|
List<DownloadEntity> list = new LinkedList<>();
|
||||||
|
Resources res = getContext().getResources();
|
||||||
|
String[] urls = res.getStringArray(R.array.highest_urls);
|
||||||
|
String[] names = res.getStringArray(R.array.highest_names);
|
||||||
|
for (int i = 0, len = urls.length; i < len; i++) {
|
||||||
|
list.add(createDownloadEntity(urls[i], names[i]));
|
||||||
}
|
}
|
||||||
|
return list;
|
||||||
public String getRadomUrl() {
|
|
||||||
Random random = new Random();
|
|
||||||
int i = random.nextInt(2);
|
|
||||||
return mTestDownloadUrl.get(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
public DownloadEntity createRandomDownloadEntity() {
|
|
||||||
return createDownloadEntity(getRadomUrl());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建下载地址
|
* 创建下载地址
|
||||||
*/
|
*/
|
||||||
public List<FileListEntity> createFileList() {
|
public List<FileListEntity> createMultiTestList() {
|
||||||
String[] names = getContext().getResources().getStringArray(R.array.file_nams);
|
String[] names = getContext().getResources().getStringArray(R.array.file_nams);
|
||||||
String[] downloadUrl = getContext().getResources().getStringArray(R.array.download_url);
|
String[] downloadUrl = getContext().getResources().getStringArray(R.array.download_url);
|
||||||
List<FileListEntity> list = new ArrayList<>();
|
List<FileListEntity> list = new ArrayList<>();
|
||||||
@ -89,70 +81,17 @@ public class DownloadModule extends BaseModule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置下载数据
|
* 创建下载实体,Aria也可以通过下载实体启动下载
|
||||||
*/
|
*/
|
||||||
public List<DownloadEntity> getDownloadData() {
|
private DownloadEntity createDownloadEntity(String downloadUrl, String name) {
|
||||||
String[] urls = getContext().getResources().getStringArray(R.array.test_apk_download_url);
|
String path = Environment.getExternalStorageDirectory() + "/download/" + name + ".apk";
|
||||||
List<DownloadEntity> list = new ArrayList<>();
|
|
||||||
for (String url : urls) {
|
|
||||||
DownloadEntity entity = Aria.download(getContext()).getDownloadEntity(url);
|
|
||||||
if (entity == null) {
|
|
||||||
entity = createDownloadEntity(url);
|
|
||||||
}
|
|
||||||
list.add(entity);
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 过滤任务
|
|
||||||
*
|
|
||||||
* @param sqlEntity 数据库的下载实体
|
|
||||||
* @param createdEntity 通过下载链接生成的下载实体
|
|
||||||
*/
|
|
||||||
private List<DownloadEntity> filter(List<DownloadEntity> sqlEntity,
|
|
||||||
List<DownloadEntity> createdEntity) {
|
|
||||||
List<DownloadEntity> list = new ArrayList<>();
|
|
||||||
list.addAll(sqlEntity);
|
|
||||||
for (DownloadEntity cEntity : createdEntity) {
|
|
||||||
int count = 0;
|
|
||||||
for (DownloadEntity sEntity : sqlEntity) {
|
|
||||||
if (cEntity.getDownloadUrl().equals(sEntity.getDownloadUrl())) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
if (count == createdEntity.size()) {
|
|
||||||
list.add(cEntity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
private DownloadEntity createDownloadEntity(String url) {
|
|
||||||
String fileName = CommonUtil.keyToHashCode(url) + ".apk";
|
|
||||||
DownloadEntity entity = new DownloadEntity();
|
DownloadEntity entity = new DownloadEntity();
|
||||||
entity.setDownloadUrl(url);
|
entity.setFileName(name);
|
||||||
entity.setDownloadPath(getDownloadPath(url));
|
entity.setDownloadUrl(downloadUrl);
|
||||||
entity.setFileName(fileName);
|
entity.setDownloadPath(path);
|
||||||
//entity.setFileName("taskName_________" + i);
|
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建下载列表
|
|
||||||
*/
|
|
||||||
private List<DownloadEntity> createNewDownload() {
|
|
||||||
List<DownloadEntity> list = new ArrayList<>();
|
|
||||||
String[] urls = getContext().getResources().getStringArray(R.array.test_apk_download_url);
|
|
||||||
int i = 0;
|
|
||||||
for (String url : urls) {
|
|
||||||
list.add(createDownloadEntity(url));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 下载广播过滤器
|
* 下载广播过滤器
|
||||||
*/
|
*/
|
||||||
@ -218,18 +157,4 @@ public class DownloadModule extends BaseModule {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置下载队列
|
|
||||||
*/
|
|
||||||
private String getDownloadPath(String url) {
|
|
||||||
String path =
|
|
||||||
Environment.getExternalStorageDirectory().getPath() + "/" + AndroidUtils.getAppName(
|
|
||||||
getContext()) + "downloads/" + StringUtil.keyToHashKey(url) + ".apk";
|
|
||||||
File file = new File(path);
|
|
||||||
if (!file.getParentFile().exists()) {
|
|
||||||
file.getParentFile().mkdirs();
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -4,20 +4,27 @@ import android.os.Bundle;
|
|||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import butterknife.Bind;
|
import butterknife.Bind;
|
||||||
import com.arialyy.aria.core.Aria;
|
import com.arialyy.aria.core.Aria;
|
||||||
import com.arialyy.aria.core.download.DownloadTarget;
|
import com.arialyy.aria.core.download.DownloadEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadTask;
|
import com.arialyy.aria.core.download.DownloadTask;
|
||||||
|
import com.arialyy.aria.core.inf.IEntity;
|
||||||
import com.arialyy.frame.util.show.L;
|
import com.arialyy.frame.util.show.L;
|
||||||
import com.arialyy.simple.R;
|
import com.arialyy.simple.R;
|
||||||
import com.arialyy.simple.base.BaseActivity;
|
import com.arialyy.simple.base.BaseActivity;
|
||||||
import com.arialyy.simple.databinding.ActivityHighestPriorityBinding;
|
import com.arialyy.simple.databinding.ActivityHighestPriorityBinding;
|
||||||
import com.arialyy.simple.download.multi_download.DownloadAdapter;
|
import com.arialyy.simple.download.multi_download.DownloadAdapter;
|
||||||
import com.arialyy.simple.widget.HorizontalProgressBarWithNumber;
|
import com.arialyy.simple.widget.HorizontalProgressBarWithNumber;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by lyy on 2017/6/2.
|
* Created by lyy on 2017/6/2.
|
||||||
@ -29,14 +36,15 @@ public class HighestPriorityActivity extends BaseActivity<ActivityHighestPriorit
|
|||||||
@Bind(R.id.stop) Button mStop;
|
@Bind(R.id.stop) Button mStop;
|
||||||
@Bind(R.id.cancel) Button mCancel;
|
@Bind(R.id.cancel) Button mCancel;
|
||||||
@Bind(R.id.size) TextView mSize;
|
@Bind(R.id.size) TextView mSize;
|
||||||
@Bind(R.id.toolbar) Toolbar toolbar;
|
|
||||||
@Bind(R.id.speed) TextView mSpeed;
|
@Bind(R.id.speed) TextView mSpeed;
|
||||||
@Bind(R.id.list) RecyclerView mList;
|
@Bind(R.id.list) RecyclerView mList;
|
||||||
|
|
||||||
private String mTaskName = "狂野飙车8";
|
private String mTaskName = "光明大陆";
|
||||||
private static final String DOWNLOAD_URL =
|
private static final String DOWNLOAD_URL =
|
||||||
"http://static.gaoshouyou.com/d/82/ff/df82ed0af4ff4c1746cb191cf765aa8f.apk";
|
"https://res5.d.cn/6f78ee3bcfdd033e64892a8553a95814cf5b4a62b12a76d9eb2a694905f0dc30fa5c7f728806a4ee0b3479e7b26a38707dac92b136add91191ac1219aadb4a3aa70bfa6d06d2d8db.apk";
|
||||||
private DownloadAdapter mAdapter;
|
private DownloadAdapter mAdapter;
|
||||||
|
private List<DownloadEntity> mData = new ArrayList<>();
|
||||||
|
private Set<String> mRecord = new HashSet<>();
|
||||||
|
|
||||||
@Override protected int setLayoutId() {
|
@Override protected int setLayoutId() {
|
||||||
return R.layout.activity_highest_priority;
|
return R.layout.activity_highest_priority;
|
||||||
@ -44,17 +52,27 @@ public class HighestPriorityActivity extends BaseActivity<ActivityHighestPriorit
|
|||||||
|
|
||||||
@Override protected void init(Bundle savedInstanceState) {
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
super.init(savedInstanceState);
|
super.init(savedInstanceState);
|
||||||
setSupportActionBar(toolbar);
|
setTitle("最高优先级任务演示");
|
||||||
toolbar.setTitle("最高优先级任务演示");
|
getBinding().setTaskName("任务名:" + mTaskName + " (最高优先级任务)");
|
||||||
getBinding().setTaskName("任务名:" + mTaskName + " (该任务是最高优先级任务)");
|
|
||||||
initWidget();
|
initWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initWidget() {
|
private void initWidget() {
|
||||||
if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
|
if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
|
||||||
mPb.setProgress(Aria.download(this).load(DOWNLOAD_URL).getPercent());
|
mPb.setProgress(Aria.download(this).load(DOWNLOAD_URL).getPercent());
|
||||||
|
if (Aria.download(this).load(DOWNLOAD_URL).getTaskState() == IEntity.STATE_STOP) {
|
||||||
|
mStart.setText("恢复");
|
||||||
}
|
}
|
||||||
mAdapter = new DownloadAdapter(this, getModule(DownloadModule.class).getDownloadTaskList());
|
}
|
||||||
|
List<DownloadEntity> temp = Aria.download(this).getTaskList();
|
||||||
|
if (temp != null && !temp.isEmpty()) {
|
||||||
|
for (DownloadEntity entity : temp) {
|
||||||
|
if (entity.getDownloadUrl().equals(DOWNLOAD_URL)) continue;
|
||||||
|
mData.add(entity);
|
||||||
|
mRecord.add(entity.getDownloadUrl());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mAdapter = new DownloadAdapter(this, mData);
|
||||||
mList.setLayoutManager(new LinearLayoutManager(this));
|
mList.setLayoutManager(new LinearLayoutManager(this));
|
||||||
mList.setAdapter(mAdapter);
|
mList.setAdapter(mAdapter);
|
||||||
}
|
}
|
||||||
@ -64,6 +82,41 @@ public class HighestPriorityActivity extends BaseActivity<ActivityHighestPriorit
|
|||||||
Aria.download(this).addSchedulerListener(new MySchedulerListener());
|
Aria.download(this).addSchedulerListener(new MySchedulerListener());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
MenuInflater inflater = getMenuInflater();
|
||||||
|
inflater.inflate(R.menu.menu_highest_priority, menu);
|
||||||
|
return super.onCreateOptionsMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public boolean onMenuItemClick(MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.add_task:
|
||||||
|
List<DownloadEntity> temp = getModule(DownloadModule.class).getHighestTestList();
|
||||||
|
for (DownloadEntity entity : temp) {
|
||||||
|
String url = entity.getDownloadUrl();
|
||||||
|
if (mRecord.contains(url)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
mAdapter.addDownloadEntity(entity);
|
||||||
|
mRecord.add(url);
|
||||||
|
}
|
||||||
|
mAdapter.notifyDataSetChanged();
|
||||||
|
break;
|
||||||
|
case R.id.help:
|
||||||
|
String title = "最高优先级任务介绍";
|
||||||
|
String msg = " 将任务设置为最高优先级任务,最高优先级任务有以下特点:\n"
|
||||||
|
+ " 1、在下载队列中,有且只有一个最高优先级任务\n"
|
||||||
|
+ " 2、最高优先级任务会一直存在,直到用户手动暂停或任务完成\n"
|
||||||
|
+ " 3、任务调度器不会暂停最高优先级任务\n"
|
||||||
|
+ " 4、用户手动暂停或任务完成后,第二次重新执行该任务,该命令将失效\n"
|
||||||
|
+ " 5、如果下载队列中已经满了,则会停止队尾的任务\n"
|
||||||
|
+ " 6、把任务设置为最高优先级任务后,将自动执行任务,不需要重新调用start()启动任务";
|
||||||
|
showMsgDialog(title, msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
switch (view.getId()) {
|
switch (view.getId()) {
|
||||||
case R.id.start:
|
case R.id.start:
|
||||||
@ -99,45 +152,46 @@ public class HighestPriorityActivity extends BaseActivity<ActivityHighestPriorit
|
|||||||
|
|
||||||
private class MySchedulerListener extends Aria.DownloadSchedulerListener {
|
private class MySchedulerListener extends Aria.DownloadSchedulerListener {
|
||||||
|
|
||||||
|
@Override public void onPre(DownloadTask task) {
|
||||||
|
super.onPre(task);
|
||||||
|
mAdapter.updateState(task.getDownloadEntity());
|
||||||
|
}
|
||||||
|
|
||||||
@Override public void onTaskPre(DownloadTask task) {
|
@Override public void onTaskPre(DownloadTask task) {
|
||||||
super.onTaskPre(task);
|
super.onTaskPre(task);
|
||||||
if (task.getKey().equals(DOWNLOAD_URL)) {
|
if (task.getKey().equals(DOWNLOAD_URL)) {
|
||||||
mSize.setText(task.getConvertFileSize());
|
mSize.setText(task.getConvertFileSize());
|
||||||
} else {
|
|
||||||
mAdapter.updateState(task.getDownloadEntity());
|
|
||||||
}
|
}
|
||||||
|
mAdapter.updateState(task.getDownloadEntity());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onTaskStart(DownloadTask task) {
|
@Override public void onTaskStart(DownloadTask task) {
|
||||||
if (task.getKey().equals(DOWNLOAD_URL)) {
|
if (task.getKey().equals(DOWNLOAD_URL)) {
|
||||||
setBtState(false);
|
setBtState(false);
|
||||||
} else {
|
|
||||||
mAdapter.updateState(task.getDownloadEntity());
|
|
||||||
}
|
}
|
||||||
|
mAdapter.updateState(task.getDownloadEntity());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onTaskResume(DownloadTask task) {
|
@Override public void onTaskResume(DownloadTask task) {
|
||||||
if (task.getKey().equals(DOWNLOAD_URL)) {
|
if (task.getKey().equals(DOWNLOAD_URL)) {
|
||||||
setBtState(false);
|
setBtState(false);
|
||||||
} else {
|
|
||||||
mAdapter.updateState(task.getDownloadEntity());
|
|
||||||
}
|
}
|
||||||
|
mAdapter.updateState(task.getDownloadEntity());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onTaskStop(DownloadTask task) {
|
@Override public void onTaskStop(DownloadTask task) {
|
||||||
if (task.getKey().equals(DOWNLOAD_URL)) {
|
if (task.getKey().equals(DOWNLOAD_URL)) {
|
||||||
setBtState(true);
|
setBtState(true);
|
||||||
} else {
|
mStart.setText("恢复");
|
||||||
mAdapter.updateState(task.getDownloadEntity());
|
|
||||||
}
|
}
|
||||||
|
mAdapter.updateState(task.getDownloadEntity());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onTaskCancel(DownloadTask task) {
|
@Override public void onTaskCancel(DownloadTask task) {
|
||||||
if (task.getKey().equals(DOWNLOAD_URL)) {
|
if (task.getKey().equals(DOWNLOAD_URL)) {
|
||||||
setBtState(true);
|
setBtState(true);
|
||||||
} else {
|
|
||||||
mAdapter.updateState(task.getDownloadEntity());
|
|
||||||
}
|
}
|
||||||
|
mAdapter.updateState(task.getDownloadEntity());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onTaskFail(DownloadTask task) {
|
@Override public void onTaskFail(DownloadTask task) {
|
||||||
@ -152,16 +206,15 @@ public class HighestPriorityActivity extends BaseActivity<ActivityHighestPriorit
|
|||||||
if (task.getKey().equals(DOWNLOAD_URL)) {
|
if (task.getKey().equals(DOWNLOAD_URL)) {
|
||||||
setBtState(true);
|
setBtState(true);
|
||||||
}
|
}
|
||||||
|
mAdapter.updateState(task.getDownloadEntity());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onTaskRunning(DownloadTask task) {
|
@Override public void onTaskRunning(DownloadTask task) {
|
||||||
if (task.getKey().equals(DOWNLOAD_URL)) {
|
if (task.getKey().equals(DOWNLOAD_URL)) {
|
||||||
setBtState(true);
|
|
||||||
mPb.setProgress(task.getPercent());
|
mPb.setProgress(task.getPercent());
|
||||||
mSpeed.setText(task.getConvertSpeed());
|
mSpeed.setText(task.getConvertSpeed());
|
||||||
} else {
|
}
|
||||||
mAdapter.setProgress(task.getDownloadEntity());
|
mAdapter.setProgress(task.getDownloadEntity());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ import com.arialyy.aria.core.download.DownloadTarget;
|
|||||||
import com.arialyy.aria.core.Aria;
|
import com.arialyy.aria.core.Aria;
|
||||||
import com.arialyy.aria.core.download.DownloadEntity;
|
import com.arialyy.aria.core.download.DownloadEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadTask;
|
import com.arialyy.aria.core.download.DownloadTask;
|
||||||
|
import com.arialyy.aria.core.inf.IEntity;
|
||||||
import com.arialyy.aria.util.CommonUtil;
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
import com.arialyy.aria.util.Speed;
|
import com.arialyy.aria.util.Speed;
|
||||||
import com.arialyy.frame.util.show.L;
|
import com.arialyy.frame.util.show.L;
|
||||||
@ -66,7 +67,6 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
@Bind(R.id.stop) Button mStop;
|
@Bind(R.id.stop) Button mStop;
|
||||||
@Bind(R.id.cancel) Button mCancel;
|
@Bind(R.id.cancel) Button mCancel;
|
||||||
@Bind(R.id.size) TextView mSize;
|
@Bind(R.id.size) TextView mSize;
|
||||||
@Bind(R.id.toolbar) Toolbar toolbar;
|
|
||||||
@Bind(R.id.speed) TextView mSpeed;
|
@Bind(R.id.speed) TextView mSpeed;
|
||||||
@Bind(R.id.speeds) RadioGroup mRg;
|
@Bind(R.id.speeds) RadioGroup mRg;
|
||||||
private DownloadEntity mEntity;
|
private DownloadEntity mEntity;
|
||||||
@ -140,11 +140,6 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
mStop.setEnabled(!state);
|
mStop.setEnabled(!state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override protected void onResume() {
|
@Override protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
Aria.download(this).addSchedulerListener(new MySchedulerListener());
|
Aria.download(this).addSchedulerListener(new MySchedulerListener());
|
||||||
@ -157,17 +152,15 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
|
|
||||||
@Override protected void init(Bundle savedInstanceState) {
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
super.init(savedInstanceState);
|
super.init(savedInstanceState);
|
||||||
setSupportActionBar(toolbar);
|
setTitle("单任务下载");
|
||||||
toolbar.setTitle("单任务下载");
|
|
||||||
init();
|
|
||||||
Aria.get(this).getDownloadConfig().setOpenBreadCast(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init() {
|
|
||||||
if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
|
if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
|
||||||
mPb.setProgress(Aria.download(this).load(DOWNLOAD_URL).getPercent());
|
mPb.setProgress(Aria.download(this).load(DOWNLOAD_URL).getPercent());
|
||||||
|
if (Aria.download(this).load(DOWNLOAD_URL).getTaskState() == IEntity.STATE_STOP) {
|
||||||
|
mStart.setText("恢复");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Aria.get(this).getDownloadConfig().setOpenBreadCast(true);
|
||||||
|
}
|
||||||
|
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
switch (view.getId()) {
|
switch (view.getId()) {
|
||||||
@ -193,9 +186,8 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
|
|
||||||
private class MySchedulerListener extends Aria.DownloadSchedulerListener {
|
private class MySchedulerListener extends Aria.DownloadSchedulerListener {
|
||||||
|
|
||||||
@Override public void onPre(String url) {
|
@Override public void onPre(DownloadTask task) {
|
||||||
super.onPre(url);
|
super.onPre(task);
|
||||||
Log.d(TAG, "url ==> " + url);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onNoSupportBreakPoint(DownloadTask task) {
|
@Override public void onNoSupportBreakPoint(DownloadTask task) {
|
||||||
|
@ -55,6 +55,11 @@ public class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapte
|
|||||||
return new MyHolder(convertView);
|
return new MyHolder(convertView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addDownloadEntity(DownloadEntity entity) {
|
||||||
|
mData.add(entity);
|
||||||
|
mPositions.put(entity.getDownloadUrl(), mPositions.size());
|
||||||
|
}
|
||||||
|
|
||||||
@Override protected int setLayoutId(int type) {
|
@Override protected int setLayoutId(int type) {
|
||||||
return R.layout.item_download;
|
return R.layout.item_download;
|
||||||
}
|
}
|
||||||
@ -148,7 +153,7 @@ public class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapte
|
|||||||
|
|
||||||
private String covertCurrentSize(long currentSize) {
|
private String covertCurrentSize(long currentSize) {
|
||||||
String size = CommonUtil.formatFileSize(currentSize);
|
String size = CommonUtil.formatFileSize(currentSize);
|
||||||
return size.substring(0, size.length() - 1);
|
return size.substring(0, size.length() - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getColor(int color) {
|
private int getColor(int color) {
|
||||||
|
@ -34,7 +34,6 @@ import com.arialyy.simple.databinding.ActivityMultiDownloadBinding;
|
|||||||
|
|
||||||
public class MultiDownloadActivity extends BaseActivity<ActivityMultiDownloadBinding> {
|
public class MultiDownloadActivity extends BaseActivity<ActivityMultiDownloadBinding> {
|
||||||
@Bind(R.id.list) RecyclerView mList;
|
@Bind(R.id.list) RecyclerView mList;
|
||||||
@Bind(R.id.toolbar) Toolbar mBar;
|
|
||||||
private DownloadAdapter mAdapter;
|
private DownloadAdapter mAdapter;
|
||||||
|
|
||||||
@Override protected int setLayoutId() {
|
@Override protected int setLayoutId() {
|
||||||
@ -43,14 +42,10 @@ public class MultiDownloadActivity extends BaseActivity<ActivityMultiDownloadBin
|
|||||||
|
|
||||||
@Override protected void init(Bundle savedInstanceState) {
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
super.init(savedInstanceState);
|
super.init(savedInstanceState);
|
||||||
|
setTitle("下载列表");
|
||||||
mAdapter = new DownloadAdapter(this, Aria.download(this).getTaskList());
|
mAdapter = new DownloadAdapter(this, Aria.download(this).getTaskList());
|
||||||
mList.setLayoutManager(new LinearLayoutManager(this));
|
mList.setLayoutManager(new LinearLayoutManager(this));
|
||||||
mList.setAdapter(mAdapter);
|
mList.setAdapter(mAdapter);
|
||||||
mBar.setTitle("多任务下载");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override protected void dataCallback(int result, Object data) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override protected void onResume() {
|
@Override protected void onResume() {
|
||||||
|
@ -47,9 +47,8 @@ public class MultiTaskActivity extends BaseActivity<ActivityMultiBinding> {
|
|||||||
|
|
||||||
@Override protected void init(Bundle savedInstanceState) {
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
super.init(savedInstanceState);
|
super.init(savedInstanceState);
|
||||||
setSupportActionBar(mBar);
|
setTitle("多任务下载");
|
||||||
mBar.setTitle("多任务下载");
|
mData.addAll(getModule(DownloadModule.class).createMultiTestList());
|
||||||
mData.addAll(getModule(DownloadModule.class).createFileList());
|
|
||||||
mAdapter = new FileListAdapter(this, mData);
|
mAdapter = new FileListAdapter(this, mData);
|
||||||
mList.setLayoutManager(new LinearLayoutManager(this));
|
mList.setLayoutManager(new LinearLayoutManager(this));
|
||||||
mList.setAdapter(mAdapter);
|
mList.setAdapter(mAdapter);
|
||||||
|
@ -108,9 +108,8 @@ public class UploadActivity extends BaseActivity<ActivityUploadMeanBinding> {
|
|||||||
this.handler = new WeakReference<>(handler);
|
this.handler = new WeakReference<>(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onPre(String url) {
|
@Override public void onPre(UploadTask task) {
|
||||||
super.onPre(url);
|
super.onPre(task);
|
||||||
L.e(TAG, "url ==> " + url);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onTaskPre(UploadTask task) {
|
@Override public void onTaskPre(UploadTask task) {
|
||||||
|
@ -35,12 +35,18 @@
|
|||||||
android:layout_below="@+id/name"
|
android:layout_below="@+id/name"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:layout_below="@+id/task"
|
||||||
|
android:background="@android:color/darker_gray"
|
||||||
|
/>
|
||||||
|
|
||||||
<android.support.v7.widget.RecyclerView
|
<android.support.v7.widget.RecyclerView
|
||||||
android:id="@+id/list"
|
android:id="@+id/list"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:layout_below="@+id/task"
|
android:layout_below="@+id/task"
|
||||||
android:layout_margin="16dp"
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
63
app/src/main/res/layout/dialog_msg.xml
Normal file
63
app/src/main/res/layout/dialog_msg.xml
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<data>
|
||||||
|
<variable
|
||||||
|
name="title"
|
||||||
|
type="java.lang.String"
|
||||||
|
/>
|
||||||
|
<variable
|
||||||
|
name="msg"
|
||||||
|
type="java.lang.String"
|
||||||
|
/>
|
||||||
|
</data>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@color/white"
|
||||||
|
android:orientation="vertical"
|
||||||
|
>
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@color/background_color"
|
||||||
|
android:gravity="center|left"
|
||||||
|
android:maxHeight="400dp"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:text="@{title}"
|
||||||
|
android:textColor="@android:color/black"
|
||||||
|
android:textSize="22sp"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:maxHeight="400dp"
|
||||||
|
>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/msg"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="15dp"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:gravity="center_vertical|left"
|
||||||
|
android:lineSpacingMultiplier="1.2"
|
||||||
|
android:text="@{msg}"
|
||||||
|
android:textColor="#000"
|
||||||
|
android:textSize="16sp"
|
||||||
|
/>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/enter"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="确定"
|
||||||
|
style="?buttonBarButtonStyle"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</layout>
|
@ -2,7 +2,10 @@
|
|||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:padding="16dp"
|
android:paddingBottom="8dp"
|
||||||
|
android:paddingLeft="16dp"
|
||||||
|
android:paddingRight="16dp"
|
||||||
|
android:paddingTop="8dp"
|
||||||
>
|
>
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
@ -45,8 +48,8 @@
|
|||||||
android:id="@+id/speed"
|
android:id="@+id/speed"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignRight="@+id/progressBar"
|
||||||
android:layout_alignTop="@+id/fileSize"
|
android:layout_alignTop="@+id/fileSize"
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:text="0kb/s"
|
android:text="0kb/s"
|
||||||
android:textColor="@color/black"
|
android:textColor="@color/black"
|
||||||
/>
|
/>
|
||||||
@ -55,8 +58,9 @@
|
|||||||
android:id="@+id/del"
|
android:id="@+id/del"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignRight="@+id/progressBar"
|
|
||||||
android:layout_alignTop="@+id/fileSize"
|
android:layout_alignTop="@+id/fileSize"
|
||||||
|
android:layout_marginLeft="18dp"
|
||||||
|
android:layout_toRightOf="@+id/progressBar"
|
||||||
android:text="删除"
|
android:text="删除"
|
||||||
android:textColor="@color/bt_selector_cancel"
|
android:textColor="@color/bt_selector_cancel"
|
||||||
/>
|
/>
|
||||||
@ -67,7 +71,7 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@+id/bar"
|
android:layout_below="@+id/bar"
|
||||||
android:layout_marginTop="10dp"
|
android:layout_marginTop="5dp"
|
||||||
android:text="name"
|
android:text="name"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@ -76,7 +80,9 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@+id/name"
|
android:layout_below="@+id/name"
|
||||||
android:layout_marginTop="10dp"
|
android:layout_marginTop="5dp"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="2"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
@ -84,7 +90,7 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@+id/download_url"
|
android:layout_below="@+id/download_url"
|
||||||
android:layout_marginTop="10dp"
|
android:layout_marginTop="5dp"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
21
app/src/main/res/menu/menu_highest_priority.xml
Normal file
21
app/src/main/res/menu/menu_highest_priority.xml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/add_task"
|
||||||
|
android:icon="@mipmap/ic_add_black_48dp"
|
||||||
|
android:orderInCategory="80"
|
||||||
|
android:title="添加一组任务"
|
||||||
|
app:showAsAction="ifRoom"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/help"
|
||||||
|
android:icon="@mipmap/ic_help_black_48dp"
|
||||||
|
android:orderInCategory="90"
|
||||||
|
android:title="最高优先级任务介绍"
|
||||||
|
app:showAsAction="ifRoom"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</menu>
|
BIN
app/src/main/res/mipmap-mdpi/ic_add_black_48dp.png
Normal file
BIN
app/src/main/res/mipmap-mdpi/ic_add_black_48dp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 199 B |
BIN
app/src/main/res/mipmap-mdpi/ic_help_black_48dp.png
Normal file
BIN
app/src/main/res/mipmap-mdpi/ic_help_black_48dp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 578 B |
@ -32,4 +32,16 @@
|
|||||||
<item>http://rs.0.gaoshouyou.com/d/e7/3d/73e716d3353de5b479fcf7da8d36a5ef.apk</item>
|
<item>http://rs.0.gaoshouyou.com/d/e7/3d/73e716d3353de5b479fcf7da8d36a5ef.apk</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="highest_names">
|
||||||
|
<item>豪门足球风云</item>
|
||||||
|
<item>碧蓝航线</item>
|
||||||
|
<item>天龙八部手游</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="highest_urls">
|
||||||
|
<item>https://res5.d.cn/6f78ee3bcfdd033e0193c05c74acd280a32d5c1d8da7a68963da81a1403751e88e8f115ea475566c54456b74d82098c836577f54711a35bbb149e0bd88dc15c48845327fae8652cc.apk</item>
|
||||||
|
<item>https://res5.d.cn/6f78ee3bcfdd033e1861859eaef45235b089f60f2e08c0e0e4fc8959d94de1e358a5149b4bec8519eabc62a53eebea280a05ef2d902d3153ae1dec4cb07b505e90a9f50af7dd14c4.apk</item>
|
||||||
|
<item>https://res5.d.cn/6f78ee3bcfdd033ef8e38596afb298d87de07e5f0f1f91f22acd57750f8ae68270531e2b266ea41c86cd196da839a0afef1952dde89773c7e26b9019249503174ca0513fa0a36a6472c4202bbf94da382964a0478471b753ebd95b67aac7ad89.apk</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
Reference in New Issue
Block a user