Merge branch 'v_3.0'
This commit is contained in:
@ -7,8 +7,8 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 9
|
minSdkVersion 9
|
||||||
targetSdkVersion 23
|
targetSdkVersion 23
|
||||||
versionCode 102
|
versionCode 310
|
||||||
versionName "3.0.3"
|
versionName "3.1.0"
|
||||||
}
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
|
@ -31,17 +31,20 @@ import android.widget.PopupWindow;
|
|||||||
import com.arialyy.aria.core.download.DownloadReceiver;
|
import com.arialyy.aria.core.download.DownloadReceiver;
|
||||||
import com.arialyy.aria.core.inf.ICmd;
|
import com.arialyy.aria.core.inf.ICmd;
|
||||||
import com.arialyy.aria.core.inf.IReceiver;
|
import com.arialyy.aria.core.inf.IReceiver;
|
||||||
import com.arialyy.aria.core.queue.DownloadTaskQueue;
|
|
||||||
import com.arialyy.aria.core.upload.UploadReceiver;
|
import com.arialyy.aria.core.upload.UploadReceiver;
|
||||||
import com.arialyy.aria.orm.DbUtil;
|
import com.arialyy.aria.orm.DbUtil;
|
||||||
import com.arialyy.aria.util.CAConfiguration;
|
import com.arialyy.aria.util.FileUtil;
|
||||||
import com.arialyy.aria.util.Configuration_1;
|
import java.io.File;
|
||||||
import com.arialyy.aria.util.Speed;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by lyy on 2016/12/1.
|
* Created by lyy on 2016/12/1.
|
||||||
@ -57,12 +60,14 @@ import java.util.Map;
|
|||||||
private Map<String, IReceiver> mReceivers = new HashMap<>();
|
private Map<String, IReceiver> mReceivers = new HashMap<>();
|
||||||
public static Context APP;
|
public static Context APP;
|
||||||
private List<ICmd> mCommands = new ArrayList<>();
|
private List<ICmd> mCommands = new ArrayList<>();
|
||||||
private Configuration mConfig;
|
private Configuration.DownloadConfig mDConfig;
|
||||||
|
private Configuration.UploadConfig mUConfig;
|
||||||
|
|
||||||
private AriaManager(Context context) {
|
private AriaManager(Context context) {
|
||||||
DbUtil.init(context.getApplicationContext());
|
DbUtil.init(context.getApplicationContext());
|
||||||
APP = context.getApplicationContext();
|
APP = context.getApplicationContext();
|
||||||
regAppLifeCallback(context);
|
regAppLifeCallback(context);
|
||||||
|
initConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AriaManager getInstance(Context context) {
|
public static AriaManager getInstance(Context context) {
|
||||||
@ -79,10 +84,43 @@ import java.util.Map;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置最大下载速度
|
* 加载配置文件
|
||||||
*/
|
*/
|
||||||
public void setMaxSpeed(Speed speed) {
|
private void loadConfig() {
|
||||||
Configuration_1.getInstance().setMaxSpeed(speed);
|
try {
|
||||||
|
ConfigHelper helper = new ConfigHelper();
|
||||||
|
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||||
|
SAXParser parser = factory.newSAXParser();
|
||||||
|
parser.parse(APP.getAssets().open("aria_config.xml"), helper);
|
||||||
|
} catch (ParserConfigurationException | IOException | SAXException e) {
|
||||||
|
Log.e(TAG, e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果需要在代码中修改下载配置,请使用以下方法
|
||||||
|
* <pre>
|
||||||
|
* <code>
|
||||||
|
* //修改最大任务队列数
|
||||||
|
* Aria.get(this).getDownloadConfig().setMaxTaskNum(3);
|
||||||
|
* </code>
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
public Configuration.DownloadConfig getDownloadConfig() {
|
||||||
|
return mDConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果需要在代码中修改下载配置,请使用以下方法
|
||||||
|
* <pre>
|
||||||
|
* <code>
|
||||||
|
* //修改最大任务队列数
|
||||||
|
* Aria.get(this).getUploadConfig().setMaxTaskNum(3);
|
||||||
|
* </code>
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
public Configuration.UploadConfig getUploadConfig() {
|
||||||
|
return mUConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -135,70 +173,6 @@ import java.util.Map;
|
|||||||
return (receiver instanceof UploadReceiver) ? (UploadReceiver) receiver : null;
|
return (receiver instanceof UploadReceiver) ? (UploadReceiver) receiver : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置CA证书信息
|
|
||||||
*
|
|
||||||
* @param caAlias ca证书别名
|
|
||||||
* @param caPath assets 文件夹下的ca证书完整路径
|
|
||||||
*/
|
|
||||||
public void setCAInfo(String caAlias, String caPath) {
|
|
||||||
if (TextUtils.isEmpty(caAlias)) {
|
|
||||||
Log.e(TAG, "ca证书别名不能为null");
|
|
||||||
return;
|
|
||||||
} else if (TextUtils.isEmpty(caPath)) {
|
|
||||||
Log.e(TAG, "ca证书路径不能为null");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
CAConfiguration.CA_ALIAS = caAlias;
|
|
||||||
CAConfiguration.CA_PATH = caPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置下载超时时间
|
|
||||||
*/
|
|
||||||
@Deprecated private AriaManager setTimeOut(int timeOut) {
|
|
||||||
Configuration_1.getInstance().setTimeOut(timeOut);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置失败重试次数
|
|
||||||
*/
|
|
||||||
public AriaManager setReTryNum(int reTryNum) {
|
|
||||||
Configuration_1.getInstance().setReTryNum(reTryNum);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置失败重试间隔
|
|
||||||
*/
|
|
||||||
public AriaManager setReTryInterval(int interval) {
|
|
||||||
Configuration_1.getInstance().setReTryInterval(interval);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否打开下载广播
|
|
||||||
*/
|
|
||||||
public AriaManager openBroadcast(boolean open) {
|
|
||||||
Configuration_1.getInstance().setOpenBroadcast(open);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置最大下载数,最大下载数不能小于1
|
|
||||||
*
|
|
||||||
* @param maxDownloadNum 最大下载数
|
|
||||||
*/
|
|
||||||
public AriaManager setMaxDownloadNum(int maxDownloadNum) {
|
|
||||||
if (maxDownloadNum < 1) {
|
|
||||||
Log.w(TAG, "最大任务数不能小于 1");
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
DownloadTaskQueue.getInstance().setDownloadNum(maxDownloadNum);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
private IReceiver putReceiver(boolean isDownload, Object obj) {
|
private IReceiver putReceiver(boolean isDownload, Object obj) {
|
||||||
final String key = getKey(isDownload, obj);
|
final String key = getKey(isDownload, obj);
|
||||||
IReceiver receiver = mReceivers.get(key);
|
IReceiver receiver = mReceivers.get(key);
|
||||||
@ -268,6 +242,27 @@ import java.util.Map;
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化配置文件
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
File xmlFile = new File(APP.getFilesDir().getPath() + Configuration.XML_FILE);
|
||||||
|
if (!xmlFile.exists()) {
|
||||||
|
loadConfig();
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
String md5Code = FileUtil.getFileMD5(xmlFile);
|
||||||
|
if (!FileUtil.checkMD5(md5Code, APP.getAssets().open("aria_config.xml"))) {
|
||||||
|
loadConfig();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mDConfig = Configuration.DownloadConfig.getInstance();
|
||||||
|
mUConfig = Configuration.UploadConfig.getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册APP生命周期回调
|
* 注册APP生命周期回调
|
||||||
*/
|
*/
|
||||||
|
234
Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java
Normal file
234
Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
/*
|
||||||
|
* 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.core;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Aria.Lao on 2017/5/22.
|
||||||
|
* 读取配置文件
|
||||||
|
*/
|
||||||
|
public class ConfigHelper extends DefaultHandler {
|
||||||
|
private final String TAG = "ConfigHelper";
|
||||||
|
|
||||||
|
private boolean isDownloadConfig = false, isUploadConfig;
|
||||||
|
private Configuration.DownloadConfig mDownloadConfig = Configuration.DownloadConfig.getInstance();
|
||||||
|
private Configuration.UploadConfig mUploadConfig = Configuration.UploadConfig.getInstance();
|
||||||
|
|
||||||
|
@Override public void startDocument() throws SAXException {
|
||||||
|
super.startDocument();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes)
|
||||||
|
throws SAXException {
|
||||||
|
super.startElement(uri, localName, qName, attributes);
|
||||||
|
if (qName.equals("download")) {
|
||||||
|
isDownloadConfig = true;
|
||||||
|
isUploadConfig = false;
|
||||||
|
} else if (qName.equals("upload")) {
|
||||||
|
isUploadConfig = true;
|
||||||
|
isDownloadConfig = false;
|
||||||
|
}
|
||||||
|
if (isDownloadConfig || isUploadConfig) {
|
||||||
|
|
||||||
|
String value = attributes.getValue("value");
|
||||||
|
switch (qName) {
|
||||||
|
case "threadNum":
|
||||||
|
loadThreadNum(value);
|
||||||
|
break;
|
||||||
|
case "openBroadcast":
|
||||||
|
loadBroadcast(value);
|
||||||
|
break;
|
||||||
|
case "maxTaskNum":
|
||||||
|
loadMaxQueue(value);
|
||||||
|
break;
|
||||||
|
case "reTryNum":
|
||||||
|
loadReTry(value);
|
||||||
|
break;
|
||||||
|
case "connectTimeOut":
|
||||||
|
loadConnectTime(value);
|
||||||
|
break;
|
||||||
|
case "iOTimeOut":
|
||||||
|
loadIOTimeout(value);
|
||||||
|
break;
|
||||||
|
case "reTryInterval":
|
||||||
|
loadReTryInterval(value);
|
||||||
|
break;
|
||||||
|
case "buffSize":
|
||||||
|
loadBuffSize(value);
|
||||||
|
break;
|
||||||
|
case "ca":
|
||||||
|
String caName = attributes.getValue("name");
|
||||||
|
String caPath = attributes.getValue("path");
|
||||||
|
loadCA(caName, caPath);
|
||||||
|
break;
|
||||||
|
case "convertSpeed":
|
||||||
|
loadConvertSpeed(value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadConvertSpeed(String value) {
|
||||||
|
boolean open = Boolean.parseBoolean(value);
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.isConvertSpeed = open;
|
||||||
|
}
|
||||||
|
if (isUploadConfig) {
|
||||||
|
mUploadConfig.isConvertSpeed = open;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadReTryInterval(String value) {
|
||||||
|
int time = 2 * 1000;
|
||||||
|
if (!TextUtils.isEmpty(value)) {
|
||||||
|
time = Integer.parseInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time < 2 * 1000) {
|
||||||
|
time = 2 * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.reTryInterval = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadCA(String name, String path) {
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.caName = name;
|
||||||
|
mDownloadConfig.caPath = path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadBuffSize(String value) {
|
||||||
|
int buffSize = 8192;
|
||||||
|
if (!TextUtils.isEmpty(value)) {
|
||||||
|
buffSize = Integer.parseInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffSize < 2048) {
|
||||||
|
buffSize = 2048;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.buffSize = buffSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadIOTimeout(String value) {
|
||||||
|
int time = 10 * 1000;
|
||||||
|
if (!TextUtils.isEmpty(value)) {
|
||||||
|
time = Integer.parseInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time < 10 * 1000) {
|
||||||
|
time = 10 * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.iOTimeOut = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadConnectTime(String value) {
|
||||||
|
int time = 5 * 1000;
|
||||||
|
if (!TextUtils.isEmpty(value)) {
|
||||||
|
time = Integer.parseInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.connectTimeOut = time;
|
||||||
|
}
|
||||||
|
if (isUploadConfig) {
|
||||||
|
mUploadConfig.connectTimeOut = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadReTry(String value) {
|
||||||
|
int num = 0;
|
||||||
|
if (!TextUtils.isEmpty(value)) {
|
||||||
|
num = Integer.parseInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.reTryNum = num;
|
||||||
|
}
|
||||||
|
if (isUploadConfig) {
|
||||||
|
mUploadConfig.reTryNum = num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadMaxQueue(String value) {
|
||||||
|
int num = 2;
|
||||||
|
if (!TextUtils.isEmpty(value)) {
|
||||||
|
num = Integer.parseInt(value);
|
||||||
|
}
|
||||||
|
if (num < 1) {
|
||||||
|
Log.e(TAG, "任务队列数不能小于 1");
|
||||||
|
num = 2;
|
||||||
|
}
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.maxTaskNum = num;
|
||||||
|
}
|
||||||
|
if (isUploadConfig) {
|
||||||
|
mUploadConfig.maxTaskNum = num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadBroadcast(String value) {
|
||||||
|
boolean open = Boolean.parseBoolean(value);
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.isOpenBreadCast = open;
|
||||||
|
}
|
||||||
|
if (isUploadConfig) {
|
||||||
|
mUploadConfig.isOpenBreadCast = open;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadThreadNum(String value) {
|
||||||
|
int num = 3;
|
||||||
|
if (!TextUtils.isEmpty(value)) {
|
||||||
|
num = Integer.parseInt(value);
|
||||||
|
}
|
||||||
|
if (num < 1) {
|
||||||
|
Log.e(TAG, "下载线程数不能小于 1");
|
||||||
|
num = 3;
|
||||||
|
}
|
||||||
|
if (isDownloadConfig) {
|
||||||
|
mDownloadConfig.threadNum = num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void characters(char[] ch, int start, int length) throws SAXException {
|
||||||
|
super.characters(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||||
|
super.endElement(uri, localName, qName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void endDocument() throws SAXException {
|
||||||
|
super.endDocument();
|
||||||
|
mDownloadConfig.saveAll();
|
||||||
|
mUploadConfig.saveAll();
|
||||||
|
}
|
||||||
|
}
|
@ -15,36 +15,200 @@
|
|||||||
*/
|
*/
|
||||||
package com.arialyy.aria.core;
|
package com.arialyy.aria.core;
|
||||||
|
|
||||||
|
import com.arialyy.aria.core.queue.DownloadTaskQueue;
|
||||||
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
|
import com.arialyy.aria.util.ReflectionUtil;
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by AriaL on 2016/12/8.
|
* Created by AriaL on 2016/12/8.
|
||||||
* 信息配置
|
* 信息配置
|
||||||
*/
|
*/
|
||||||
class Configuration {
|
class Configuration {
|
||||||
private static final String TAG = "Configuration";
|
static final String DOWNLOAD_CONFIG_FILE = "/Aria/DownloadConfig.properties";
|
||||||
private static final String CONFIG_FILE = "/Aria/ADConfig.properties";
|
static final String UPLOAD_CONFIG_FILE = "/Aria/UploadConfig.properties";
|
||||||
private static final String CONFIG_KEY = "ARIA_CONFIG";
|
static final String XML_FILE = "/Aria/aria_config.xml";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通用配置
|
* 通用配置
|
||||||
*/
|
*/
|
||||||
static class BaseConfig {
|
public static class BaseConfig {
|
||||||
public boolean isOpenBreadCast = false;
|
/**
|
||||||
|
* 旧任务数
|
||||||
|
*/
|
||||||
|
public static int oldMaxTaskNum = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否发送任务广播,true,发送
|
||||||
|
*/
|
||||||
|
boolean isOpenBreadCast = false;
|
||||||
/**
|
/**
|
||||||
* 任务队列最大任务数, 默认为2
|
* 任务队列最大任务数, 默认为2
|
||||||
*/
|
*/
|
||||||
public int maxQueueNum = 2;
|
int maxTaskNum = 2;
|
||||||
/**
|
/**
|
||||||
* 下载失败,重试次数,默认为10
|
* 下载失败,重试次数,默认为10
|
||||||
*/
|
*/
|
||||||
public int reTryNum = 10;
|
int reTryNum = 10;
|
||||||
/**
|
/**
|
||||||
* 设置重试间隔,单位为毫秒,默认2000毫秒
|
* 设置重试间隔,单位为毫秒,默认2000毫秒
|
||||||
*/
|
*/
|
||||||
public long reTryInterval = 2000;
|
int reTryInterval = 2000;
|
||||||
/**
|
/**
|
||||||
* 设置url连接超时时间,单位为毫秒,默认5000毫秒
|
* 设置url连接超时时间,单位为毫秒,默认5000毫秒
|
||||||
*/
|
*/
|
||||||
public long connectTimeOut = 5000;
|
int connectTimeOut = 5000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否需要转换速度单位,转换完成后为:1b/s、1k/s、1m/s、1g/s、1t/s,如果不需要将返回byte长度
|
||||||
|
*/
|
||||||
|
boolean isConvertSpeed = false;
|
||||||
|
|
||||||
|
public boolean isOpenBreadCast() {
|
||||||
|
return isOpenBreadCast;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseConfig setOpenBreadCast(boolean openBreadCast) {
|
||||||
|
isOpenBreadCast = openBreadCast;
|
||||||
|
saveKey("isOpenBreadCast", openBreadCast + "");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMaxTaskNum() {
|
||||||
|
return maxTaskNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseConfig setMaxTaskNum(int maxTaskNum) {
|
||||||
|
oldMaxTaskNum = this.maxTaskNum;
|
||||||
|
this.maxTaskNum = maxTaskNum;
|
||||||
|
saveKey("maxTaskNum", maxTaskNum + "");
|
||||||
|
DownloadTaskQueue.getInstance().setDownloadNum(maxTaskNum);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getReTryNum() {
|
||||||
|
return reTryNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseConfig setReTryNum(int reTryNum) {
|
||||||
|
this.reTryNum = reTryNum;
|
||||||
|
saveKey("reTryNum", reTryNum + "");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getReTryInterval() {
|
||||||
|
return reTryInterval;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseConfig setReTryInterval(int reTryInterval) {
|
||||||
|
this.reTryInterval = reTryInterval;
|
||||||
|
saveKey("reTryInterval", reTryInterval + "");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isConvertSpeed() {
|
||||||
|
return isConvertSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseConfig setConvertSpeed(boolean convertSpeed) {
|
||||||
|
isConvertSpeed = convertSpeed;
|
||||||
|
saveKey("isConvertSpeed", isConvertSpeed + "");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getConnectTimeOut() {
|
||||||
|
return connectTimeOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseConfig setConnectTimeOut(int connectTimeOut) {
|
||||||
|
this.connectTimeOut = connectTimeOut;
|
||||||
|
saveKey("connectTimeOut", connectTimeOut + "");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存key
|
||||||
|
*/
|
||||||
|
void saveKey(String key, String value) {
|
||||||
|
boolean isDownload = this instanceof DownloadConfig;
|
||||||
|
File file = new File(
|
||||||
|
AriaManager.APP.getFilesDir().getPath() + (isDownload ? DOWNLOAD_CONFIG_FILE
|
||||||
|
: UPLOAD_CONFIG_FILE));
|
||||||
|
if (file.exists()) {
|
||||||
|
Properties properties = CommonUtil.loadConfig(file);
|
||||||
|
properties.setProperty(key, value);
|
||||||
|
CommonUtil.saveConfig(file, properties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载配置
|
||||||
|
*/
|
||||||
|
void loadConfig() {
|
||||||
|
boolean isDownload = this instanceof DownloadConfig;
|
||||||
|
File file = new File(
|
||||||
|
AriaManager.APP.getFilesDir().getPath() + (isDownload ? DOWNLOAD_CONFIG_FILE
|
||||||
|
: UPLOAD_CONFIG_FILE));
|
||||||
|
if (file.exists()) {
|
||||||
|
Properties properties = CommonUtil.loadConfig(file);
|
||||||
|
List<Field> fields = ReflectionUtil.getAllFields(getClass());
|
||||||
|
try {
|
||||||
|
for (Field field : fields) {
|
||||||
|
int m = field.getModifiers();
|
||||||
|
if (Modifier.isFinal(m) || Modifier.isStatic(m)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
field.setAccessible(true);
|
||||||
|
String value = properties.getProperty(field.getName());
|
||||||
|
Class<?> type = field.getType();
|
||||||
|
if (type == String.class) {
|
||||||
|
field.set(this, value);
|
||||||
|
} else if (type == int.class || type == Integer.class) {
|
||||||
|
field.setInt(this, Integer.parseInt(value));
|
||||||
|
} else if (type == float.class || type == Float.class) {
|
||||||
|
field.setFloat(this, Float.parseFloat(value));
|
||||||
|
} else if (type == double.class || type == Double.class) {
|
||||||
|
field.setDouble(this, Double.parseDouble(value));
|
||||||
|
} else if (type == long.class || type == Long.class) {
|
||||||
|
field.setLong(this, Long.parseLong(value));
|
||||||
|
} else if (type == boolean.class || type == Boolean.class) {
|
||||||
|
field.setBoolean(this, Boolean.parseBoolean(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存配置
|
||||||
|
*/
|
||||||
|
void saveAll() {
|
||||||
|
List<Field> fields = ReflectionUtil.getAllFields(getClass());
|
||||||
|
boolean isDownload = this instanceof DownloadConfig;
|
||||||
|
try {
|
||||||
|
File file = new File(
|
||||||
|
AriaManager.APP.getFilesDir().getPath() + (isDownload ? DOWNLOAD_CONFIG_FILE
|
||||||
|
: UPLOAD_CONFIG_FILE));
|
||||||
|
Properties properties = CommonUtil.loadConfig(file);
|
||||||
|
for (Field field : fields) {
|
||||||
|
int m = field.getModifiers();
|
||||||
|
if (Modifier.isFinal(m) || Modifier.isStatic(m)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
field.setAccessible(true);
|
||||||
|
properties.setProperty(field.getName(), field.get(this) + "");
|
||||||
|
}
|
||||||
|
CommonUtil.saveConfig(file, properties);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,19 +218,82 @@ class Configuration {
|
|||||||
/**
|
/**
|
||||||
* 设置IO流读取时间,单位为毫秒,默认20000毫秒,该时间不能少于10000毫秒
|
* 设置IO流读取时间,单位为毫秒,默认20000毫秒,该时间不能少于10000毫秒
|
||||||
*/
|
*/
|
||||||
public long readTimeout = 20 * 1000;
|
int iOTimeOut = 20 * 1000;
|
||||||
/**
|
/**
|
||||||
* 设置写文件buff大小,该数值大小不能小于2048,数值变小,下载速度会变慢
|
* 设置写文件buff大小,该数值大小不能小于2048,数值变小,下载速度会变慢
|
||||||
*/
|
*/
|
||||||
public int buffSize = 8192;
|
int buffSize = 8192;
|
||||||
/**
|
/**
|
||||||
* 设置https ca 证书信息;path 为assets目录下的CA证书完整路径
|
* 设置https ca 证书信息;path 为assets目录下的CA证书完整路径
|
||||||
*/
|
*/
|
||||||
public String caPath;
|
String caPath;
|
||||||
/**
|
/**
|
||||||
* name 为CA证书名
|
* name 为CA证书名
|
||||||
*/
|
*/
|
||||||
public String caName;
|
String caName;
|
||||||
|
/**
|
||||||
|
* 下载线程数,下载线程数不能小于1
|
||||||
|
*/
|
||||||
|
int threadNum = 3;
|
||||||
|
|
||||||
|
public int getIOTimeOut() {
|
||||||
|
return iOTimeOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DownloadConfig setIOTimeOut(int iOTimeOut) {
|
||||||
|
this.iOTimeOut = iOTimeOut;
|
||||||
|
saveKey("iOTimeOut", iOTimeOut + "");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBuffSize() {
|
||||||
|
return buffSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DownloadConfig setBuffSize(int buffSize) {
|
||||||
|
this.buffSize = buffSize;
|
||||||
|
saveKey("buffSize", buffSize + "");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCaPath() {
|
||||||
|
return caPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DownloadConfig setCaPath(String caPath) {
|
||||||
|
this.caPath = caPath;
|
||||||
|
saveKey("caPath", caPath);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCaName() {
|
||||||
|
return caName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DownloadConfig setCaName(String caName) {
|
||||||
|
this.caName = caName;
|
||||||
|
saveKey("caName", caName);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getThreadNum() {
|
||||||
|
return threadNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
private DownloadConfig() {
|
||||||
|
loadConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DownloadConfig INSTANCE = null;
|
||||||
|
|
||||||
|
static DownloadConfig getInstance() {
|
||||||
|
if (INSTANCE == null) {
|
||||||
|
synchronized (DownloadConfig.class) {
|
||||||
|
INSTANCE = new DownloadConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -74,5 +301,19 @@ class Configuration {
|
|||||||
*/
|
*/
|
||||||
public static class UploadConfig extends BaseConfig {
|
public static class UploadConfig extends BaseConfig {
|
||||||
|
|
||||||
|
private UploadConfig() {
|
||||||
|
loadConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static UploadConfig INSTANCE = null;
|
||||||
|
|
||||||
|
static UploadConfig getInstance() {
|
||||||
|
if (INSTANCE == null) {
|
||||||
|
synchronized (DownloadConfig.class) {
|
||||||
|
INSTANCE = new UploadConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ import com.arialyy.aria.orm.DbEntity;
|
|||||||
*/
|
*/
|
||||||
public class DownloadEntity extends DbEntity implements Parcelable, IEntity {
|
public class DownloadEntity extends DbEntity implements Parcelable, IEntity {
|
||||||
@Ignore private long speed = 0; //下载速度
|
@Ignore private long speed = 0; //下载速度
|
||||||
|
@Ignore private String convertSpeed = "0b/s";
|
||||||
@Ignore private int failNum = 0;
|
@Ignore private int failNum = 0;
|
||||||
private String downloadUrl = ""; //下载路径
|
private String downloadUrl = ""; //下载路径
|
||||||
private String downloadPath = ""; //保存路径
|
private String downloadPath = ""; //保存路径
|
||||||
@ -122,6 +123,14 @@ public class DownloadEntity extends DbEntity implements Parcelable, IEntity {
|
|||||||
isDownloadComplete = downloadComplete;
|
isDownloadComplete = downloadComplete;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getConvertSpeed() {
|
||||||
|
return convertSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConvertSpeed(String convertSpeed) {
|
||||||
|
this.convertSpeed = convertSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
public long getSpeed() {
|
public long getSpeed() {
|
||||||
return speed;
|
return speed;
|
||||||
}
|
}
|
||||||
@ -162,6 +171,9 @@ public class DownloadEntity extends DbEntity implements Parcelable, IEntity {
|
|||||||
return "DownloadEntity{"
|
return "DownloadEntity{"
|
||||||
+ "speed="
|
+ "speed="
|
||||||
+ speed
|
+ speed
|
||||||
|
+ ", convertSpeed='"
|
||||||
|
+ convertSpeed
|
||||||
|
+ '\''
|
||||||
+ ", failNum="
|
+ ", failNum="
|
||||||
+ failNum
|
+ failNum
|
||||||
+ ", downloadUrl='"
|
+ ", downloadUrl='"
|
||||||
@ -200,6 +212,7 @@ public class DownloadEntity extends DbEntity implements Parcelable, IEntity {
|
|||||||
|
|
||||||
@Override public void writeToParcel(Parcel dest, int flags) {
|
@Override public void writeToParcel(Parcel dest, int flags) {
|
||||||
dest.writeLong(this.speed);
|
dest.writeLong(this.speed);
|
||||||
|
dest.writeString(this.convertSpeed);
|
||||||
dest.writeInt(this.failNum);
|
dest.writeInt(this.failNum);
|
||||||
dest.writeString(this.downloadUrl);
|
dest.writeString(this.downloadUrl);
|
||||||
dest.writeString(this.downloadPath);
|
dest.writeString(this.downloadPath);
|
||||||
@ -216,6 +229,7 @@ public class DownloadEntity extends DbEntity implements Parcelable, IEntity {
|
|||||||
|
|
||||||
protected DownloadEntity(Parcel in) {
|
protected DownloadEntity(Parcel in) {
|
||||||
this.speed = in.readLong();
|
this.speed = in.readLong();
|
||||||
|
this.convertSpeed = in.readString();
|
||||||
this.failNum = in.readInt();
|
this.failNum = in.readInt();
|
||||||
this.downloadUrl = in.readString();
|
this.downloadUrl = in.readString();
|
||||||
this.downloadPath = in.readString();
|
this.downloadPath = in.readString();
|
||||||
|
@ -23,10 +23,10 @@ final class DownloadStateConstance {
|
|||||||
int CANCEL_NUM = 0;
|
int CANCEL_NUM = 0;
|
||||||
int STOP_NUM = 0;
|
int STOP_NUM = 0;
|
||||||
int FAIL_NUM = 0;
|
int FAIL_NUM = 0;
|
||||||
int CONNECT_TIME_OUT = 5000 * 4; //连接超时时间
|
int CONNECT_TIME_OUT; //连接超时时间
|
||||||
int READ_TIME_OUT = 1000 * 20; //流读取的超时时间
|
int READ_TIME_OUT; //流读取的超时时间
|
||||||
int COMPLETE_THREAD_NUM = 0;
|
int COMPLETE_THREAD_NUM = 0;
|
||||||
int THREAD_NUM = 3;
|
int THREAD_NUM;
|
||||||
long CURRENT_LOCATION = 0;
|
long CURRENT_LOCATION = 0;
|
||||||
boolean isDownloading = false;
|
boolean isDownloading = false;
|
||||||
boolean isCancel = false;
|
boolean isCancel = false;
|
||||||
|
@ -27,7 +27,6 @@ import com.arialyy.aria.core.scheduler.DownloadSchedulers;
|
|||||||
import com.arialyy.aria.core.scheduler.ISchedulers;
|
import com.arialyy.aria.core.scheduler.ISchedulers;
|
||||||
import com.arialyy.aria.util.CheckUtil;
|
import com.arialyy.aria.util.CheckUtil;
|
||||||
import com.arialyy.aria.util.CommonUtil;
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
import com.arialyy.aria.util.Configuration_1;
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,32 +40,61 @@ public class DownloadTask implements ITask {
|
|||||||
*/
|
*/
|
||||||
private String mTargetName;
|
private String mTargetName;
|
||||||
private DownloadEntity mEntity;
|
private DownloadEntity mEntity;
|
||||||
private DownloadTaskEntity mTaskEntity;
|
|
||||||
private IDownloadListener mListener;
|
private IDownloadListener mListener;
|
||||||
private Handler mOutHandler;
|
private Handler mOutHandler;
|
||||||
private IDownloadUtil mUtil;
|
private IDownloadUtil mUtil;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
|
||||||
private DownloadTask(DownloadTaskEntity taskEntity, Handler outHandler) {
|
private DownloadTask(DownloadTaskEntity taskEntity, Handler outHandler) {
|
||||||
mTaskEntity = taskEntity;
|
|
||||||
mEntity = taskEntity.downloadEntity;
|
mEntity = taskEntity.downloadEntity;
|
||||||
mOutHandler = outHandler;
|
mOutHandler = outHandler;
|
||||||
mContext = AriaManager.APP;
|
mContext = AriaManager.APP;
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init() {
|
|
||||||
mListener = new DListener(mContext, this, mOutHandler);
|
mListener = new DListener(mContext, this, mOutHandler);
|
||||||
mUtil = new DownloadUtil(mContext, mTaskEntity, mListener);
|
mUtil = new DownloadUtil(mContext, taskEntity, mListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取下载速度
|
* @return 返回原始byte速度,需要你在配置文件中配置
|
||||||
|
* <pre>
|
||||||
|
* {@code
|
||||||
|
* <xml>
|
||||||
|
* <download>
|
||||||
|
* ...
|
||||||
|
* <convertSpeed value="false"/>
|
||||||
|
* </download>
|
||||||
|
*
|
||||||
|
* 或在代码中设置
|
||||||
|
* Aria.get(this).getDownloadConfig().setConvertSpeed(false);
|
||||||
|
* </xml>
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
* 才能生效
|
||||||
*/
|
*/
|
||||||
@Override public long getSpeed() {
|
@Override public long getSpeed() {
|
||||||
return mEntity.getSpeed();
|
return mEntity.getSpeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 返回转换单位后的速度,需要你在配置文件中配置,转换完成后为:1b/s、1k/s、1m/s、1g/s、1t/s
|
||||||
|
* <pre>
|
||||||
|
* {@code
|
||||||
|
* <xml>
|
||||||
|
* <download>
|
||||||
|
* ...
|
||||||
|
* <convertSpeed value="true"/>
|
||||||
|
* </download>
|
||||||
|
*
|
||||||
|
* 或在代码中设置
|
||||||
|
* Aria.get(this).getDownloadConfig().setConvertSpeed(true);
|
||||||
|
* </xml>
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
* 才能生效
|
||||||
|
*/
|
||||||
|
@Override public String getConvertSpeed() {
|
||||||
|
return mEntity.getConvertSpeed();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取文件大小
|
* 获取文件大小
|
||||||
*/
|
*/
|
||||||
@ -178,32 +206,14 @@ public class DownloadTask implements ITask {
|
|||||||
intent.putExtra(Aria.ENTITY, mEntity);
|
intent.putExtra(Aria.ENTITY, mEntity);
|
||||||
mContext.sendBroadcast(intent);
|
mContext.sendBroadcast(intent);
|
||||||
}
|
}
|
||||||
//if (mEntity.isDownloadComplete()) {
|
|
||||||
// //mUtil.cancelDownload();
|
|
||||||
//} else {
|
|
||||||
// // 如果任务不是下载状态
|
|
||||||
// mUtil.cancelDownload();
|
|
||||||
// mUtil.delConfigFile();
|
|
||||||
// mUtil.delTempFile();
|
|
||||||
// mEntity.deleteData();
|
|
||||||
// if (mOutHandler != null) {
|
|
||||||
// mOutHandler.obtainMessage(DownloadSchedulers.CANCEL, this).sendToTarget();
|
|
||||||
// }
|
|
||||||
// //发送取消下载的广播
|
|
||||||
// Intent intent = CommonUtil.createIntent(mContext.getPackageName(), Aria.ACTION_CANCEL);
|
|
||||||
// intent.putExtra(Aria.ENTITY, mEntity);
|
|
||||||
// mContext.sendBroadcast(intent);
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
DownloadTaskEntity taskEntity;
|
DownloadTaskEntity taskEntity;
|
||||||
Handler outHandler;
|
Handler outHandler;
|
||||||
int threadNum = 3;
|
|
||||||
String targetName;
|
String targetName;
|
||||||
|
|
||||||
public Builder(String targetName, DownloadTaskEntity taskEntity) {
|
public Builder(String targetName, DownloadTaskEntity taskEntity) {
|
||||||
//CheckUtil.checkDownloadTaskEntity(taskEntity.downloadEntity);
|
|
||||||
CheckUtil.checkTaskEntity(taskEntity);
|
CheckUtil.checkTaskEntity(taskEntity);
|
||||||
this.targetName = targetName;
|
this.targetName = targetName;
|
||||||
this.taskEntity = taskEntity;
|
this.taskEntity = taskEntity;
|
||||||
@ -219,14 +229,6 @@ public class DownloadTask implements ITask {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置线程数
|
|
||||||
*/
|
|
||||||
public Builder setThreadNum(int threadNum) {
|
|
||||||
this.threadNum = threadNum;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DownloadTask build() {
|
public DownloadTask build() {
|
||||||
DownloadTask task = new DownloadTask(taskEntity, outHandler);
|
DownloadTask task = new DownloadTask(taskEntity, outHandler);
|
||||||
task.setTargetName(targetName);
|
task.setTargetName(targetName);
|
||||||
@ -243,13 +245,14 @@ public class DownloadTask implements ITask {
|
|||||||
WeakReference<DownloadTask> wTask;
|
WeakReference<DownloadTask> wTask;
|
||||||
Context context;
|
Context context;
|
||||||
Intent sendIntent;
|
Intent sendIntent;
|
||||||
long INTERVAL = 1024 * 10; //10k大小的间隔
|
|
||||||
long lastLen = 0; //上一次发送长度
|
long lastLen = 0; //上一次发送长度
|
||||||
long lastTime = 0;
|
long lastTime = 0;
|
||||||
long INTERVAL_TIME = 1000; //1m更新周期
|
long INTERVAL_TIME = 1000; //1m更新周期
|
||||||
boolean isFirst = true;
|
boolean isFirst = true;
|
||||||
DownloadEntity downloadEntity;
|
DownloadEntity downloadEntity;
|
||||||
DownloadTask task;
|
DownloadTask task;
|
||||||
|
boolean isOpenBroadCast = false;
|
||||||
|
boolean isConvertSpeed = false;
|
||||||
|
|
||||||
DListener(Context context, DownloadTask task, Handler outHandler) {
|
DListener(Context context, DownloadTask task, Handler outHandler) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
@ -259,6 +262,9 @@ public class DownloadTask implements ITask {
|
|||||||
this.downloadEntity = this.task.getDownloadEntity();
|
this.downloadEntity = this.task.getDownloadEntity();
|
||||||
sendIntent = CommonUtil.createIntent(context.getPackageName(), Aria.ACTION_RUNNING);
|
sendIntent = CommonUtil.createIntent(context.getPackageName(), Aria.ACTION_RUNNING);
|
||||||
sendIntent.putExtra(Aria.ENTITY, downloadEntity);
|
sendIntent.putExtra(Aria.ENTITY, downloadEntity);
|
||||||
|
final AriaManager manager = AriaManager.getInstance(context);
|
||||||
|
isOpenBroadCast = manager.getDownloadConfig().isOpenBreadCast();
|
||||||
|
isConvertSpeed = manager.getDownloadConfig().isConvertSpeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void supportBreakpoint(boolean support) {
|
@Override public void supportBreakpoint(boolean support) {
|
||||||
@ -305,11 +311,10 @@ public class DownloadTask implements ITask {
|
|||||||
sendIntent.putExtra(Aria.CURRENT_SPEED, speed);
|
sendIntent.putExtra(Aria.CURRENT_SPEED, speed);
|
||||||
lastTime = System.currentTimeMillis();
|
lastTime = System.currentTimeMillis();
|
||||||
if (isFirst) {
|
if (isFirst) {
|
||||||
downloadEntity.setSpeed(0);
|
speed = 0;
|
||||||
isFirst = false;
|
isFirst = false;
|
||||||
} else {
|
|
||||||
downloadEntity.setSpeed(speed);
|
|
||||||
}
|
}
|
||||||
|
handleSpeed(speed);
|
||||||
downloadEntity.setCurrentProgress(currentLocation);
|
downloadEntity.setCurrentProgress(currentLocation);
|
||||||
lastLen = currentLocation;
|
lastLen = currentLocation;
|
||||||
sendInState2Target(DownloadSchedulers.RUNNING);
|
sendInState2Target(DownloadSchedulers.RUNNING);
|
||||||
@ -320,7 +325,7 @@ public class DownloadTask implements ITask {
|
|||||||
@Override public void onStop(long stopLocation) {
|
@Override public void onStop(long stopLocation) {
|
||||||
super.onStop(stopLocation);
|
super.onStop(stopLocation);
|
||||||
downloadEntity.setState(DownloadEntity.STATE_STOP);
|
downloadEntity.setState(DownloadEntity.STATE_STOP);
|
||||||
downloadEntity.setSpeed(0);
|
handleSpeed(0);
|
||||||
sendInState2Target(DownloadSchedulers.STOP);
|
sendInState2Target(DownloadSchedulers.STOP);
|
||||||
sendIntent(Aria.ACTION_STOP, stopLocation);
|
sendIntent(Aria.ACTION_STOP, stopLocation);
|
||||||
}
|
}
|
||||||
@ -328,6 +333,7 @@ public class DownloadTask implements ITask {
|
|||||||
@Override public void onCancel() {
|
@Override public void onCancel() {
|
||||||
super.onCancel();
|
super.onCancel();
|
||||||
downloadEntity.setState(DownloadEntity.STATE_CANCEL);
|
downloadEntity.setState(DownloadEntity.STATE_CANCEL);
|
||||||
|
handleSpeed(0);
|
||||||
sendInState2Target(DownloadSchedulers.CANCEL);
|
sendInState2Target(DownloadSchedulers.CANCEL);
|
||||||
sendIntent(Aria.ACTION_CANCEL, -1);
|
sendIntent(Aria.ACTION_CANCEL, -1);
|
||||||
downloadEntity.deleteData();
|
downloadEntity.deleteData();
|
||||||
@ -337,7 +343,7 @@ public class DownloadTask implements ITask {
|
|||||||
super.onComplete();
|
super.onComplete();
|
||||||
downloadEntity.setState(DownloadEntity.STATE_COMPLETE);
|
downloadEntity.setState(DownloadEntity.STATE_COMPLETE);
|
||||||
downloadEntity.setDownloadComplete(true);
|
downloadEntity.setDownloadComplete(true);
|
||||||
downloadEntity.setSpeed(0);
|
handleSpeed(0);
|
||||||
sendInState2Target(DownloadSchedulers.COMPLETE);
|
sendInState2Target(DownloadSchedulers.COMPLETE);
|
||||||
sendIntent(Aria.ACTION_COMPLETE, downloadEntity.getFileSize());
|
sendIntent(Aria.ACTION_COMPLETE, downloadEntity.getFileSize());
|
||||||
}
|
}
|
||||||
@ -346,11 +352,19 @@ public class DownloadTask implements ITask {
|
|||||||
super.onFail();
|
super.onFail();
|
||||||
downloadEntity.setFailNum(downloadEntity.getFailNum() + 1);
|
downloadEntity.setFailNum(downloadEntity.getFailNum() + 1);
|
||||||
downloadEntity.setState(DownloadEntity.STATE_FAIL);
|
downloadEntity.setState(DownloadEntity.STATE_FAIL);
|
||||||
downloadEntity.setSpeed(0);
|
handleSpeed(0);
|
||||||
sendInState2Target(DownloadSchedulers.FAIL);
|
sendInState2Target(DownloadSchedulers.FAIL);
|
||||||
sendIntent(Aria.ACTION_FAIL, -1);
|
sendIntent(Aria.ACTION_FAIL, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleSpeed(long speed) {
|
||||||
|
if (isConvertSpeed) {
|
||||||
|
downloadEntity.setConvertSpeed(CommonUtil.formatFileSize(speed) + "/s");
|
||||||
|
} else {
|
||||||
|
downloadEntity.setSpeed(speed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将任务状态发送给下载器
|
* 将任务状态发送给下载器
|
||||||
*
|
*
|
||||||
@ -366,7 +380,7 @@ public class DownloadTask implements ITask {
|
|||||||
downloadEntity.setDownloadComplete(action.equals(Aria.ACTION_COMPLETE));
|
downloadEntity.setDownloadComplete(action.equals(Aria.ACTION_COMPLETE));
|
||||||
downloadEntity.setCurrentProgress(location);
|
downloadEntity.setCurrentProgress(location);
|
||||||
downloadEntity.update();
|
downloadEntity.update();
|
||||||
if (!Configuration_1.isOpenBreadCast) return;
|
if (!isOpenBroadCast) return;
|
||||||
Intent intent = CommonUtil.createIntent(context.getPackageName(), action);
|
Intent intent = CommonUtil.createIntent(context.getPackageName(), action);
|
||||||
intent.putExtra(Aria.ENTITY, downloadEntity);
|
intent.putExtra(Aria.ENTITY, downloadEntity);
|
||||||
if (location != -1) {
|
if (location != -1) {
|
||||||
|
@ -19,6 +19,7 @@ package com.arialyy.aria.core.download;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
import com.arialyy.aria.core.AriaManager;
|
||||||
import com.arialyy.aria.util.BufferedRandomAccessFile;
|
import com.arialyy.aria.util.BufferedRandomAccessFile;
|
||||||
import com.arialyy.aria.util.CheckUtil;
|
import com.arialyy.aria.util.CheckUtil;
|
||||||
import com.arialyy.aria.util.CommonUtil;
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
@ -34,7 +35,7 @@ import java.util.concurrent.Executors;
|
|||||||
* Created by lyy on 2015/8/25.
|
* Created by lyy on 2015/8/25.
|
||||||
* 下载工具类
|
* 下载工具类
|
||||||
*/
|
*/
|
||||||
public class DownloadUtil implements IDownloadUtil, Runnable {
|
class DownloadUtil implements IDownloadUtil, Runnable {
|
||||||
private static final String TAG = "DownloadUtil";
|
private static final String TAG = "DownloadUtil";
|
||||||
/**
|
/**
|
||||||
* 线程数
|
* 线程数
|
||||||
@ -46,8 +47,7 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
private static final long SUB_LEN = 1024 * 1024;
|
private static final long SUB_LEN = 1024 * 1024;
|
||||||
//下载监听
|
//下载监听
|
||||||
private IDownloadListener mListener;
|
private IDownloadListener mListener;
|
||||||
private int mConnectTimeOut = 5000 * 4; //连接超时时间
|
private int mConnectTimeOut = 0; //连接超时时间
|
||||||
private int mReadTimeOut = 5000 * 20; //流读取的超时时间
|
|
||||||
private boolean isNewTask = true;
|
private boolean isNewTask = true;
|
||||||
private boolean isSupportBreakpoint = true;
|
private boolean isSupportBreakpoint = true;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@ -57,34 +57,29 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
private File mDownloadFile; //下载的文件
|
private File mDownloadFile; //下载的文件
|
||||||
private File mConfigFile;//下载信息配置文件
|
private File mConfigFile;//下载信息配置文件
|
||||||
private SparseArray<Runnable> mTask = new SparseArray<>();
|
private SparseArray<Runnable> mTask = new SparseArray<>();
|
||||||
private DownloadStateConstance mConstance;
|
private DownloadStateConstance CONSTANCE;
|
||||||
|
|
||||||
DownloadUtil(Context context, DownloadTaskEntity entity, IDownloadListener downloadListener) {
|
DownloadUtil(Context context, DownloadTaskEntity entity, IDownloadListener downloadListener) {
|
||||||
this(context, entity, downloadListener, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
DownloadUtil(Context context, DownloadTaskEntity entity, IDownloadListener downloadListener,
|
|
||||||
int threadNum) {
|
|
||||||
//CheckUtil.checkDownloadTaskEntity(entity.downloadEntity);
|
|
||||||
CheckUtil.checkTaskEntity(entity);
|
CheckUtil.checkTaskEntity(entity);
|
||||||
mDownloadEntity = entity.downloadEntity;
|
mDownloadEntity = entity.downloadEntity;
|
||||||
mContext = context.getApplicationContext();
|
mContext = context.getApplicationContext();
|
||||||
mDownloadTaskEntity = entity;
|
mDownloadTaskEntity = entity;
|
||||||
mListener = downloadListener;
|
mListener = downloadListener;
|
||||||
THREAD_NUM = threadNum;
|
// 线程下载数改变后,新的下载才会生效
|
||||||
mFixedThreadPool = Executors.newFixedThreadPool(Integer.MAX_VALUE);
|
mFixedThreadPool = Executors.newFixedThreadPool(Integer.MAX_VALUE);
|
||||||
mConstance = new DownloadStateConstance();
|
CONSTANCE = new DownloadStateConstance();
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init() {
|
private void init() {
|
||||||
|
mConnectTimeOut = AriaManager.getInstance(mContext).getDownloadConfig().getConnectTimeOut();
|
||||||
mDownloadFile = new File(mDownloadTaskEntity.downloadEntity.getDownloadPath());
|
mDownloadFile = new File(mDownloadTaskEntity.downloadEntity.getDownloadPath());
|
||||||
//读取已完成的线程数
|
//读取已完成的线程数
|
||||||
mConfigFile = new File(
|
mConfigFile = new File(
|
||||||
mContext.getFilesDir().getPath() + "/temp/" + mDownloadFile.getName() + ".properties");
|
mContext.getFilesDir().getPath() + "/temp/" + mDownloadFile.getName() + ".properties");
|
||||||
try {
|
try {
|
||||||
if (!mConfigFile.exists()) { //记录文件被删除,则重新下载
|
if (!mConfigFile.exists()) { //记录文件被删除,则重新下载
|
||||||
isNewTask = true;
|
handleNewTask();
|
||||||
CommonUtil.createFile(mConfigFile.getPath());
|
CommonUtil.createFile(mConfigFile.getPath());
|
||||||
} else {
|
} else {
|
||||||
isNewTask = !mDownloadFile.exists();
|
isNewTask = !mDownloadFile.exists();
|
||||||
@ -99,37 +94,23 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
return mListener;
|
return mListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置连接超时时间
|
|
||||||
*/
|
|
||||||
public void setConnectTimeOut(int timeOut) {
|
|
||||||
mConnectTimeOut = timeOut;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置流读取的超时时间
|
|
||||||
*/
|
|
||||||
public void setReadTimeOut(int readTimeOut) {
|
|
||||||
mReadTimeOut = readTimeOut;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前下载位置
|
* 获取当前下载位置
|
||||||
*/
|
*/
|
||||||
@Override public long getCurrentLocation() {
|
@Override public long getCurrentLocation() {
|
||||||
return mConstance.CURRENT_LOCATION;
|
return CONSTANCE.CURRENT_LOCATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean isDownloading() {
|
@Override public boolean isDownloading() {
|
||||||
return mConstance.isDownloading;
|
return CONSTANCE.isDownloading;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 取消下载
|
* 取消下载
|
||||||
*/
|
*/
|
||||||
@Override public void cancelDownload() {
|
@Override public void cancelDownload() {
|
||||||
mConstance.isCancel = true;
|
CONSTANCE.isCancel = true;
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
mFixedThreadPool.shutdown();
|
mFixedThreadPool.shutdown();
|
||||||
for (int i = 0; i < THREAD_NUM; i++) {
|
for (int i = 0; i < THREAD_NUM; i++) {
|
||||||
SingleThreadTask task = (SingleThreadTask) mTask.get(i);
|
SingleThreadTask task = (SingleThreadTask) mTask.get(i);
|
||||||
@ -143,8 +124,8 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
* 停止下载
|
* 停止下载
|
||||||
*/
|
*/
|
||||||
@Override public void stopDownload() {
|
@Override public void stopDownload() {
|
||||||
mConstance.isStop = true;
|
CONSTANCE.isStop = true;
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
mFixedThreadPool.shutdown();
|
mFixedThreadPool.shutdown();
|
||||||
for (int i = 0; i < THREAD_NUM; i++) {
|
for (int i = 0; i < THREAD_NUM; i++) {
|
||||||
SingleThreadTask task = (SingleThreadTask) mTask.get(i);
|
SingleThreadTask task = (SingleThreadTask) mTask.get(i);
|
||||||
@ -184,7 +165,7 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
* 多线程断点续传下载文件,开始下载
|
* 多线程断点续传下载文件,开始下载
|
||||||
*/
|
*/
|
||||||
@Override public void startDownload() {
|
@Override public void startDownload() {
|
||||||
mConstance.cleanState();
|
CONSTANCE.cleanState();
|
||||||
mListener.onPre();
|
mListener.onPre();
|
||||||
new Thread(this).start();
|
new Thread(this).start();
|
||||||
}
|
}
|
||||||
@ -195,7 +176,7 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
|
|
||||||
private void failDownload(String msg) {
|
private void failDownload(String msg) {
|
||||||
Log.e(TAG, msg);
|
Log.e(TAG, msg);
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
stopDownload();
|
stopDownload();
|
||||||
mListener.onFail();
|
mListener.onFail();
|
||||||
}
|
}
|
||||||
@ -206,7 +187,7 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
HttpURLConnection conn = ConnectionHelp.handleConnection(url);
|
HttpURLConnection conn = ConnectionHelp.handleConnection(url);
|
||||||
conn = ConnectionHelp.setConnectParam(mDownloadTaskEntity, conn);
|
conn = ConnectionHelp.setConnectParam(mDownloadTaskEntity, conn);
|
||||||
conn.setRequestProperty("Range", "bytes=" + 0 + "-");
|
conn.setRequestProperty("Range", "bytes=" + 0 + "-");
|
||||||
conn.setConnectTimeout(mConnectTimeOut * 4);
|
conn.setConnectTimeout(mConnectTimeOut);
|
||||||
conn.connect();
|
conn.connect();
|
||||||
handleConnect(conn);
|
handleConnect(conn);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@ -283,7 +264,7 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
conn = ConnectionHelp.setConnectParam(mDownloadTaskEntity, conn);
|
conn = ConnectionHelp.setConnectParam(mDownloadTaskEntity, conn);
|
||||||
conn.setRequestProperty("Cookie", cookies);
|
conn.setRequestProperty("Cookie", cookies);
|
||||||
conn.setRequestProperty("Range", "bytes=" + 0 + "-");
|
conn.setRequestProperty("Range", "bytes=" + 0 + "-");
|
||||||
conn.setConnectTimeout(mConnectTimeOut * 4);
|
conn.setConnectTimeout(mConnectTimeOut);
|
||||||
conn.connect();
|
conn.connect();
|
||||||
|
|
||||||
handleConnect(conn);
|
handleConnect(conn);
|
||||||
@ -301,7 +282,7 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
int fileLength = conn.getContentLength();
|
int fileLength = conn.getContentLength();
|
||||||
if (fileLength < SUB_LEN) {
|
if (fileLength < SUB_LEN) {
|
||||||
THREAD_NUM = 1;
|
THREAD_NUM = 1;
|
||||||
mConstance.THREAD_NUM = THREAD_NUM;
|
CONSTANCE.THREAD_NUM = THREAD_NUM;
|
||||||
}
|
}
|
||||||
Properties pro = createConfigFile(fileLength);
|
Properties pro = createConfigFile(fileLength);
|
||||||
int blockSize = fileLength / THREAD_NUM;
|
int blockSize = fileLength / THREAD_NUM;
|
||||||
@ -322,14 +303,14 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
//如果有记录,则恢复下载
|
//如果有记录,则恢复下载
|
||||||
if (!isNewTask && record != null && Long.parseLong(record + "") > 0) {
|
if (!isNewTask && record != null && Long.parseLong(record + "") > 0) {
|
||||||
Long r = Long.parseLong(record + "");
|
Long r = Long.parseLong(record + "");
|
||||||
mConstance.CURRENT_LOCATION += r - startL;
|
CONSTANCE.CURRENT_LOCATION += r - startL;
|
||||||
Log.d(TAG, "++++++++++ 线程_" + i + "_恢复下载 ++++++++++");
|
Log.d(TAG, "++++++++++ 线程_" + i + "_恢复下载 ++++++++++");
|
||||||
mListener.onChildResume(r);
|
mListener.onChildResume(r);
|
||||||
startL = r;
|
startL = r;
|
||||||
recordL[rl] = i;
|
recordL[rl] = i;
|
||||||
rl++;
|
rl++;
|
||||||
} else {
|
} else {
|
||||||
isNewTask = true;
|
handleNewTask();
|
||||||
}
|
}
|
||||||
if (isNewTask) {
|
if (isNewTask) {
|
||||||
recordL[rl] = i;
|
recordL[rl] = i;
|
||||||
@ -351,7 +332,6 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
ConfigEntity entity = new ConfigEntity();
|
ConfigEntity entity = new ConfigEntity();
|
||||||
long len = conn.getContentLength();
|
long len = conn.getContentLength();
|
||||||
entity.FILE_SIZE = len;
|
entity.FILE_SIZE = len;
|
||||||
//entity.DOWNLOAD_URL = mDownloadEntity.getDownloadUrl();
|
|
||||||
entity.DOWNLOAD_URL = mDownloadEntity.isRedirect() ? mDownloadEntity.getRedirectUrl()
|
entity.DOWNLOAD_URL = mDownloadEntity.isRedirect() ? mDownloadEntity.getRedirectUrl()
|
||||||
: mDownloadEntity.getDownloadUrl();
|
: mDownloadEntity.getDownloadUrl();
|
||||||
entity.TEMP_FILE = mDownloadFile;
|
entity.TEMP_FILE = mDownloadFile;
|
||||||
@ -362,8 +342,8 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
entity.isSupportBreakpoint = isSupportBreakpoint;
|
entity.isSupportBreakpoint = isSupportBreakpoint;
|
||||||
entity.DOWNLOAD_TASK_ENTITY = mDownloadTaskEntity;
|
entity.DOWNLOAD_TASK_ENTITY = mDownloadTaskEntity;
|
||||||
THREAD_NUM = 1;
|
THREAD_NUM = 1;
|
||||||
mConstance.THREAD_NUM = THREAD_NUM;
|
CONSTANCE.THREAD_NUM = THREAD_NUM;
|
||||||
SingleThreadTask task = new SingleThreadTask(mConstance, mListener, entity);
|
SingleThreadTask task = new SingleThreadTask(CONSTANCE, mListener, entity);
|
||||||
mTask.put(0, task);
|
mTask.put(0, task);
|
||||||
mFixedThreadPool.execute(task);
|
mFixedThreadPool.execute(task);
|
||||||
mListener.onPostPre(len);
|
mListener.onPostPre(len);
|
||||||
@ -385,15 +365,16 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
//分配每条线程的下载区间
|
//分配每条线程的下载区间
|
||||||
pro = CommonUtil.loadConfig(mConfigFile);
|
pro = CommonUtil.loadConfig(mConfigFile);
|
||||||
if (pro.isEmpty()) {
|
if (pro.isEmpty()) {
|
||||||
isNewTask = true;
|
handleNewTask();
|
||||||
} else {
|
} else {
|
||||||
|
THREAD_NUM = pro.keySet().size();
|
||||||
for (int i = 0; i < THREAD_NUM; i++) {
|
for (int i = 0; i < THREAD_NUM; i++) {
|
||||||
if (pro.getProperty(mDownloadFile.getName() + "_record_" + i) == null) {
|
if (pro.getProperty(mDownloadFile.getName() + "_record_" + i) == null) {
|
||||||
Object state = pro.getProperty(mDownloadFile.getName() + "_state_" + i);
|
Object state = pro.getProperty(mDownloadFile.getName() + "_state_" + i);
|
||||||
if (state != null && Integer.parseInt(state + "") == 1) {
|
if (state != null && Integer.parseInt(state + "") == 1) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
isNewTask = true;
|
handleNewTask();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -401,23 +382,31 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
return pro;
|
return pro;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理新任务
|
||||||
|
*/
|
||||||
|
private void handleNewTask() {
|
||||||
|
isNewTask = true;
|
||||||
|
THREAD_NUM = AriaManager.getInstance(mContext).getDownloadConfig().getThreadNum();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 恢复记录地址
|
* 恢复记录地址
|
||||||
*
|
*
|
||||||
* @return true 表示下载完成
|
* @return true 表示下载完成
|
||||||
*/
|
*/
|
||||||
private boolean resumeRecordLocation(int i, long startL, long endL) {
|
private boolean resumeRecordLocation(int i, long startL, long endL) {
|
||||||
mConstance.CURRENT_LOCATION += endL - startL;
|
CONSTANCE.CURRENT_LOCATION += endL - startL;
|
||||||
Log.d(TAG, "++++++++++ 线程_" + i + "_已经下载完成 ++++++++++");
|
Log.d(TAG, "++++++++++ 线程_" + i + "_已经下载完成 ++++++++++");
|
||||||
mConstance.COMPLETE_THREAD_NUM++;
|
CONSTANCE.COMPLETE_THREAD_NUM++;
|
||||||
mConstance.STOP_NUM++;
|
CONSTANCE.STOP_NUM++;
|
||||||
mConstance.CANCEL_NUM++;
|
CONSTANCE.CANCEL_NUM++;
|
||||||
if (mConstance.isComplete()) {
|
if (CONSTANCE.isComplete()) {
|
||||||
if (mConfigFile.exists()) {
|
if (mConfigFile.exists()) {
|
||||||
mConfigFile.delete();
|
mConfigFile.delete();
|
||||||
}
|
}
|
||||||
mListener.onComplete();
|
mListener.onComplete();
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -439,7 +428,8 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
entity.CONFIG_FILE_PATH = mConfigFile.getPath();
|
entity.CONFIG_FILE_PATH = mConfigFile.getPath();
|
||||||
entity.isSupportBreakpoint = isSupportBreakpoint;
|
entity.isSupportBreakpoint = isSupportBreakpoint;
|
||||||
entity.DOWNLOAD_TASK_ENTITY = mDownloadTaskEntity;
|
entity.DOWNLOAD_TASK_ENTITY = mDownloadTaskEntity;
|
||||||
SingleThreadTask task = new SingleThreadTask(mConstance, mListener, entity);
|
CONSTANCE.THREAD_NUM = THREAD_NUM;
|
||||||
|
SingleThreadTask task = new SingleThreadTask(CONSTANCE, mListener, entity);
|
||||||
mTask.put(i, task);
|
mTask.put(i, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -447,10 +437,10 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
|
|||||||
* 启动单线程下载任务
|
* 启动单线程下载任务
|
||||||
*/
|
*/
|
||||||
private void startSingleTask(int[] recordL) {
|
private void startSingleTask(int[] recordL) {
|
||||||
if (mConstance.CURRENT_LOCATION > 0) {
|
if (CONSTANCE.CURRENT_LOCATION > 0) {
|
||||||
mListener.onResume(mConstance.CURRENT_LOCATION);
|
mListener.onResume(CONSTANCE.CURRENT_LOCATION);
|
||||||
} else {
|
} else {
|
||||||
mListener.onStart(mConstance.CURRENT_LOCATION);
|
mListener.onStart(CONSTANCE.CURRENT_LOCATION);
|
||||||
}
|
}
|
||||||
for (int l : recordL) {
|
for (int l : recordL) {
|
||||||
if (l == -1) continue;
|
if (l == -1) continue;
|
||||||
|
@ -15,10 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.arialyy.aria.core.download;
|
package com.arialyy.aria.core.download;
|
||||||
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import com.arialyy.aria.core.AriaManager;
|
||||||
import com.arialyy.aria.util.BufferedRandomAccessFile;
|
import com.arialyy.aria.util.BufferedRandomAccessFile;
|
||||||
import com.arialyy.aria.util.CommonUtil;
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -35,34 +33,33 @@ import java.util.Properties;
|
|||||||
*/
|
*/
|
||||||
final class SingleThreadTask implements Runnable {
|
final class SingleThreadTask implements Runnable {
|
||||||
private static final String TAG = "SingleThreadTask";
|
private static final String TAG = "SingleThreadTask";
|
||||||
// TODO: 2017/2/22 不能使用1024 否则最大速度不能超过3m
|
|
||||||
private static final int BUF_SIZE = 8192;
|
|
||||||
private DownloadUtil.ConfigEntity mConfigEntity;
|
private DownloadUtil.ConfigEntity mConfigEntity;
|
||||||
private String mConfigFPath;
|
private String mConfigFPath;
|
||||||
private long mChildCurrentLocation = 0;
|
private long mChildCurrentLocation = 0;
|
||||||
private static final Object LOCK = new Object();
|
private static final Object LOCK = new Object();
|
||||||
private int mBufSize = 8192;
|
private int mBufSize;
|
||||||
//private int mBufSize = 64;
|
|
||||||
private IDownloadListener mListener;
|
private IDownloadListener mListener;
|
||||||
private DownloadStateConstance mConstance;
|
private DownloadStateConstance CONSTANCE;
|
||||||
|
|
||||||
SingleThreadTask(DownloadStateConstance constance, IDownloadListener listener,
|
SingleThreadTask(DownloadStateConstance constance, IDownloadListener listener,
|
||||||
DownloadUtil.ConfigEntity downloadInfo) {
|
DownloadUtil.ConfigEntity downloadInfo) {
|
||||||
mConstance = constance;
|
AriaManager manager = AriaManager.getInstance(AriaManager.APP);
|
||||||
|
CONSTANCE = constance;
|
||||||
|
CONSTANCE.CONNECT_TIME_OUT = manager.getDownloadConfig().getConnectTimeOut();
|
||||||
|
CONSTANCE.READ_TIME_OUT = manager.getDownloadConfig().getIOTimeOut();
|
||||||
mListener = listener;
|
mListener = listener;
|
||||||
this.mConfigEntity = downloadInfo;
|
this.mConfigEntity = downloadInfo;
|
||||||
if (mConfigEntity.isSupportBreakpoint) {
|
if (mConfigEntity.isSupportBreakpoint) {
|
||||||
mConfigFPath = downloadInfo.CONFIG_FILE_PATH;
|
mConfigFPath = downloadInfo.CONFIG_FILE_PATH;
|
||||||
}
|
}
|
||||||
//mBufSize = Configuration_1.getInstance().getMaxSpeed();
|
mBufSize = manager.getDownloadConfig().getBuffSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void run() {
|
@Override public void run() {
|
||||||
HttpURLConnection conn = null;
|
HttpURLConnection conn;
|
||||||
InputStream is = null;
|
InputStream is;
|
||||||
try {
|
try {
|
||||||
URL url = new URL(mConfigEntity.DOWNLOAD_URL);
|
URL url = new URL(mConfigEntity.DOWNLOAD_URL);
|
||||||
//conn = (HttpURLConnection) url.openConnection();
|
|
||||||
conn = ConnectionHelp.handleConnection(url);
|
conn = ConnectionHelp.handleConnection(url);
|
||||||
if (mConfigEntity.isSupportBreakpoint) {
|
if (mConfigEntity.isSupportBreakpoint) {
|
||||||
Log.d(TAG, "线程_"
|
Log.d(TAG, "线程_"
|
||||||
@ -79,8 +76,8 @@ final class SingleThreadTask implements Runnable {
|
|||||||
Log.w(TAG, "该下载不支持断点");
|
Log.w(TAG, "该下载不支持断点");
|
||||||
}
|
}
|
||||||
conn = ConnectionHelp.setConnectParam(mConfigEntity.DOWNLOAD_TASK_ENTITY, conn);
|
conn = ConnectionHelp.setConnectParam(mConfigEntity.DOWNLOAD_TASK_ENTITY, conn);
|
||||||
conn.setConnectTimeout(mConstance.CONNECT_TIME_OUT);
|
conn.setConnectTimeout(CONSTANCE.CONNECT_TIME_OUT);
|
||||||
conn.setReadTimeout(mConstance.READ_TIME_OUT); //设置读取流的等待时间,必须设置该参数
|
conn.setReadTimeout(CONSTANCE.READ_TIME_OUT); //设置读取流的等待时间,必须设置该参数
|
||||||
is = conn.getInputStream();
|
is = conn.getInputStream();
|
||||||
//创建可设置位置的文件
|
//创建可设置位置的文件
|
||||||
BufferedRandomAccessFile file =
|
BufferedRandomAccessFile file =
|
||||||
@ -92,10 +89,10 @@ final class SingleThreadTask implements Runnable {
|
|||||||
//当前子线程的下载位置
|
//当前子线程的下载位置
|
||||||
mChildCurrentLocation = mConfigEntity.START_LOCATION;
|
mChildCurrentLocation = mConfigEntity.START_LOCATION;
|
||||||
while ((len = is.read(buffer)) != -1) {
|
while ((len = is.read(buffer)) != -1) {
|
||||||
if (mConstance.isCancel) {
|
if (CONSTANCE.isCancel) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (mConstance.isStop) {
|
if (CONSTANCE.isStop) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//把下载数据数据写入文件
|
//把下载数据数据写入文件
|
||||||
@ -106,11 +103,11 @@ final class SingleThreadTask implements Runnable {
|
|||||||
//close 为阻塞的,需要使用线程池来处理
|
//close 为阻塞的,需要使用线程池来处理
|
||||||
is.close();
|
is.close();
|
||||||
conn.disconnect();
|
conn.disconnect();
|
||||||
if (mConstance.isCancel) {
|
if (CONSTANCE.isCancel) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//停止状态不需要删除记录文件
|
//停止状态不需要删除记录文件
|
||||||
if (mConstance.isStop) {
|
if (CONSTANCE.isStop) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//支持断点的处理
|
//支持断点的处理
|
||||||
@ -119,29 +116,29 @@ final class SingleThreadTask implements Runnable {
|
|||||||
writeConfig(mConfigEntity.TEMP_FILE.getName() + "_state_" + mConfigEntity.THREAD_ID,
|
writeConfig(mConfigEntity.TEMP_FILE.getName() + "_state_" + mConfigEntity.THREAD_ID,
|
||||||
1 + "");
|
1 + "");
|
||||||
mListener.onChildComplete(mConfigEntity.END_LOCATION);
|
mListener.onChildComplete(mConfigEntity.END_LOCATION);
|
||||||
mConstance.COMPLETE_THREAD_NUM++;
|
CONSTANCE.COMPLETE_THREAD_NUM++;
|
||||||
if (mConstance.isComplete()) {
|
if (CONSTANCE.isComplete()) {
|
||||||
File configFile = new File(mConfigFPath);
|
File configFile = new File(mConfigFPath);
|
||||||
if (configFile.exists()) {
|
if (configFile.exists()) {
|
||||||
configFile.delete();
|
configFile.delete();
|
||||||
}
|
}
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
mListener.onComplete();
|
mListener.onComplete();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.i(TAG, "下载任务完成");
|
Log.i(TAG, "下载任务完成");
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
mListener.onComplete();
|
mListener.onComplete();
|
||||||
}
|
}
|
||||||
} catch (MalformedURLException e) {
|
} catch (MalformedURLException e) {
|
||||||
mConstance.FAIL_NUM++;
|
CONSTANCE.FAIL_NUM++;
|
||||||
failDownload(mConfigEntity, mChildCurrentLocation, "下载链接异常", e);
|
failDownload(mConfigEntity, mChildCurrentLocation, "下载链接异常", e);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
mConstance.FAIL_NUM++;
|
CONSTANCE.FAIL_NUM++;
|
||||||
failDownload(mConfigEntity, mChildCurrentLocation, "下载失败【" + mConfigEntity.DOWNLOAD_URL + "】",
|
failDownload(mConfigEntity, mChildCurrentLocation, "下载失败【" + mConfigEntity.DOWNLOAD_URL + "】",
|
||||||
e);
|
e);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
mConstance.FAIL_NUM++;
|
CONSTANCE.FAIL_NUM++;
|
||||||
failDownload(mConfigEntity, mChildCurrentLocation, "获取流失败", e);
|
failDownload(mConfigEntity, mChildCurrentLocation, "获取流失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -153,7 +150,7 @@ final class SingleThreadTask implements Runnable {
|
|||||||
synchronized (LOCK) {
|
synchronized (LOCK) {
|
||||||
try {
|
try {
|
||||||
if (mConfigEntity.isSupportBreakpoint) {
|
if (mConfigEntity.isSupportBreakpoint) {
|
||||||
mConstance.STOP_NUM++;
|
CONSTANCE.STOP_NUM++;
|
||||||
String location = String.valueOf(mChildCurrentLocation);
|
String location = String.valueOf(mChildCurrentLocation);
|
||||||
Log.d(TAG, "thread_"
|
Log.d(TAG, "thread_"
|
||||||
+ mConfigEntity.THREAD_ID
|
+ mConfigEntity.THREAD_ID
|
||||||
@ -161,15 +158,15 @@ final class SingleThreadTask implements Runnable {
|
|||||||
+ mChildCurrentLocation);
|
+ mChildCurrentLocation);
|
||||||
writeConfig(mConfigEntity.TEMP_FILE.getName() + "_record_" + mConfigEntity.THREAD_ID,
|
writeConfig(mConfigEntity.TEMP_FILE.getName() + "_record_" + mConfigEntity.THREAD_ID,
|
||||||
location);
|
location);
|
||||||
if (mConstance.isStop()) {
|
if (CONSTANCE.isStop()) {
|
||||||
Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++");
|
Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++");
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
mListener.onStop(mConstance.CURRENT_LOCATION);
|
mListener.onStop(CONSTANCE.CURRENT_LOCATION);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++");
|
Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++");
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
mListener.onStop(mConstance.CURRENT_LOCATION);
|
mListener.onStop(CONSTANCE.CURRENT_LOCATION);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -183,44 +180,20 @@ final class SingleThreadTask implements Runnable {
|
|||||||
private void progress(long len) {
|
private void progress(long len) {
|
||||||
synchronized (LOCK) {
|
synchronized (LOCK) {
|
||||||
mChildCurrentLocation += len;
|
mChildCurrentLocation += len;
|
||||||
mConstance.CURRENT_LOCATION += len;
|
CONSTANCE.CURRENT_LOCATION += len;
|
||||||
mListener.onProgress(mConstance.CURRENT_LOCATION);
|
mListener.onProgress(CONSTANCE.CURRENT_LOCATION);
|
||||||
//mHandler.sendEmptyMessage(1);
|
|
||||||
//mHandler.post(t);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Handler mHandler = new Handler(Looper.getMainLooper()) {
|
|
||||||
@Override public void handleMessage(Message msg) {
|
|
||||||
super.handleMessage(msg);
|
|
||||||
mListener.onProgress(mConstance.CURRENT_LOCATION);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Thread t = new Thread(new Runnable() {
|
|
||||||
@Override public void run() {
|
|
||||||
mListener.onProgress(mConstance.CURRENT_LOCATION);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//Handler handler = new Handler(){
|
|
||||||
// @Override public void handleMessage(Message msg) {
|
|
||||||
// super.handleMessage(msg);
|
|
||||||
// mListener.onProgress(mConstance.CURRENT_LOCATION);
|
|
||||||
// }
|
|
||||||
//};
|
|
||||||
|
|
||||||
Thread thread = new Thread();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 取消下载
|
* 取消下载
|
||||||
*/
|
*/
|
||||||
protected void cancel() {
|
protected void cancel() {
|
||||||
synchronized (LOCK) {
|
synchronized (LOCK) {
|
||||||
if (mConfigEntity.isSupportBreakpoint) {
|
if (mConfigEntity.isSupportBreakpoint) {
|
||||||
mConstance.CANCEL_NUM++;
|
CONSTANCE.CANCEL_NUM++;
|
||||||
Log.d(TAG, "++++++++++ thread_" + mConfigEntity.THREAD_ID + "_cancel ++++++++++");
|
Log.d(TAG, "++++++++++ thread_" + mConfigEntity.THREAD_ID + "_cancel ++++++++++");
|
||||||
if (mConstance.isCancel()) {
|
if (CONSTANCE.isCancel()) {
|
||||||
File configFile = new File(mConfigFPath);
|
File configFile = new File(mConfigFPath);
|
||||||
if (configFile.exists()) {
|
if (configFile.exists()) {
|
||||||
configFile.delete();
|
configFile.delete();
|
||||||
@ -229,12 +202,12 @@ final class SingleThreadTask implements Runnable {
|
|||||||
mConfigEntity.TEMP_FILE.delete();
|
mConfigEntity.TEMP_FILE.delete();
|
||||||
}
|
}
|
||||||
Log.d(TAG, "++++++++++++++++ onCancel +++++++++++++++++");
|
Log.d(TAG, "++++++++++++++++ onCancel +++++++++++++++++");
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
mListener.onCancel();
|
mListener.onCancel();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.d(TAG, "++++++++++++++++ onCancel +++++++++++++++++");
|
Log.d(TAG, "++++++++++++++++ onCancel +++++++++++++++++");
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
mListener.onCancel();
|
mListener.onCancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -247,8 +220,8 @@ final class SingleThreadTask implements Runnable {
|
|||||||
Exception ex) {
|
Exception ex) {
|
||||||
synchronized (LOCK) {
|
synchronized (LOCK) {
|
||||||
try {
|
try {
|
||||||
mConstance.isDownloading = false;
|
CONSTANCE.isDownloading = false;
|
||||||
mConstance.isStop = true;
|
CONSTANCE.isStop = true;
|
||||||
if (ex != null) {
|
if (ex != null) {
|
||||||
Log.e(TAG, CommonUtil.getPrintException(ex));
|
Log.e(TAG, CommonUtil.getPrintException(ex));
|
||||||
}
|
}
|
||||||
@ -257,7 +230,7 @@ final class SingleThreadTask implements Runnable {
|
|||||||
String location = String.valueOf(currentLocation);
|
String location = String.valueOf(currentLocation);
|
||||||
writeConfig(dEntity.TEMP_FILE.getName() + "_record_" + dEntity.THREAD_ID, location);
|
writeConfig(dEntity.TEMP_FILE.getName() + "_record_" + dEntity.THREAD_ID, location);
|
||||||
}
|
}
|
||||||
if (mConstance.isFail()) {
|
if (CONSTANCE.isFail()) {
|
||||||
Log.d(TAG, "++++++++++++++++ onFail +++++++++++++++++");
|
Log.d(TAG, "++++++++++++++++ onFail +++++++++++++++++");
|
||||||
mListener.onFail();
|
mListener.onFail();
|
||||||
}
|
}
|
||||||
|
@ -44,8 +44,16 @@ public interface ITask {
|
|||||||
|
|
||||||
public void cancel();
|
public void cancel();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 原始byte速度
|
||||||
|
*/
|
||||||
public long getSpeed();
|
public long getSpeed();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换单位后的速度
|
||||||
|
*/
|
||||||
|
public String getConvertSpeed();
|
||||||
|
|
||||||
public long getFileSize();
|
public long getFileSize();
|
||||||
|
|
||||||
public long getCurrentProgress();
|
public long getCurrentProgress();
|
||||||
|
@ -28,5 +28,4 @@ import com.arialyy.aria.core.queue.pool.ExecutePool;
|
|||||||
abstract class AbsTaskQueue<TASK extends ITask, TASK_ENTITY extends ITaskEntity, ENTITY extends IEntity>
|
abstract class AbsTaskQueue<TASK extends ITask, TASK_ENTITY extends ITaskEntity, ENTITY extends IEntity>
|
||||||
implements ITaskQueue<TASK, TASK_ENTITY, ENTITY> {
|
implements ITaskQueue<TASK, TASK_ENTITY, ENTITY> {
|
||||||
CachePool<TASK> mCachePool = new CachePool<>();
|
CachePool<TASK> mCachePool = new CachePool<>();
|
||||||
ExecutePool<TASK> mExecutePool = new ExecutePool<>();
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ package com.arialyy.aria.core.queue;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import com.arialyy.aria.core.AriaManager;
|
||||||
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.download.DownloadTaskEntity;
|
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||||
@ -25,7 +26,6 @@ import com.arialyy.aria.core.inf.IEntity;
|
|||||||
import com.arialyy.aria.core.queue.pool.CachePool;
|
import com.arialyy.aria.core.queue.pool.CachePool;
|
||||||
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 com.arialyy.aria.util.Configuration_1;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by lyy on 2016/8/17.
|
* Created by lyy on 2016/8/17.
|
||||||
@ -36,6 +36,7 @@ public class DownloadTaskQueue
|
|||||||
private static final String TAG = "DownloadTaskQueue";
|
private static final String TAG = "DownloadTaskQueue";
|
||||||
private static volatile DownloadTaskQueue INSTANCE = null;
|
private static volatile DownloadTaskQueue INSTANCE = null;
|
||||||
private static final Object LOCK = new Object();
|
private static final Object LOCK = new Object();
|
||||||
|
private ExecutePool<DownloadTask> mExecutePool = new ExecutePool<>(true);
|
||||||
|
|
||||||
public static DownloadTaskQueue getInstance() {
|
public static DownloadTaskQueue getInstance() {
|
||||||
if (INSTANCE == null) {
|
if (INSTANCE == null) {
|
||||||
@ -121,7 +122,7 @@ public class DownloadTaskQueue
|
|||||||
|
|
||||||
@Override public void setDownloadNum(int downloadNum) {
|
@Override public void setDownloadNum(int downloadNum) {
|
||||||
//原始长度
|
//原始长度
|
||||||
int size = Configuration_1.getInstance().getDownloadNum();
|
int size = AriaManager.getInstance(AriaManager.APP).getDownloadConfig().oldMaxTaskNum;
|
||||||
int diff = downloadNum - size;
|
int diff = downloadNum - size;
|
||||||
if (size == downloadNum) {
|
if (size == downloadNum) {
|
||||||
Log.d(TAG, "设置的下载任务数和配置文件的下载任务数一直,跳过");
|
Log.d(TAG, "设置的下载任务数和配置文件的下载任务数一直,跳过");
|
||||||
|
@ -66,11 +66,11 @@ public interface ITaskQueue<TASK extends ITask, TASK_ENTITY extends ITaskEntity,
|
|||||||
public int size();
|
public int size();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置下载任务数
|
* 设置最大任务数
|
||||||
*
|
*
|
||||||
* @param downloadNum 下载任务数
|
* @param newMaxNum 下载任务数
|
||||||
*/
|
*/
|
||||||
public void setDownloadNum(int downloadNum);
|
public void setDownloadNum(int newMaxNum);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建一个新的任务,创建时只是将新任务存储到缓存池
|
* 创建一个新的任务,创建时只是将新任务存储到缓存池
|
||||||
|
@ -18,6 +18,8 @@ package com.arialyy.aria.core.queue;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import com.arialyy.aria.core.download.DownloadTask;
|
||||||
|
import com.arialyy.aria.core.queue.pool.ExecutePool;
|
||||||
import com.arialyy.aria.core.scheduler.UploadSchedulers;
|
import com.arialyy.aria.core.scheduler.UploadSchedulers;
|
||||||
import com.arialyy.aria.core.upload.UploadEntity;
|
import com.arialyy.aria.core.upload.UploadEntity;
|
||||||
import com.arialyy.aria.core.upload.UploadTask;
|
import com.arialyy.aria.core.upload.UploadTask;
|
||||||
@ -31,6 +33,7 @@ public class UploadTaskQueue extends AbsTaskQueue<UploadTask, UploadTaskEntity,
|
|||||||
private static final String TAG = "UploadTaskQueue";
|
private static final String TAG = "UploadTaskQueue";
|
||||||
private static volatile UploadTaskQueue INSTANCE = null;
|
private static volatile UploadTaskQueue INSTANCE = null;
|
||||||
private static final Object LOCK = new Object();
|
private static final Object LOCK = new Object();
|
||||||
|
private ExecutePool<UploadTask> mExecutePool = new ExecutePool<>(false);
|
||||||
|
|
||||||
public static UploadTaskQueue getInstance() {
|
public static UploadTaskQueue getInstance() {
|
||||||
if (INSTANCE == null) {
|
if (INSTANCE == null) {
|
||||||
|
@ -18,9 +18,9 @@ package com.arialyy.aria.core.queue.pool;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import com.arialyy.aria.core.AriaManager;
|
||||||
import com.arialyy.aria.core.inf.ITask;
|
import com.arialyy.aria.core.inf.ITask;
|
||||||
import com.arialyy.aria.util.CommonUtil;
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
import com.arialyy.aria.util.Configuration_1;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
@ -38,8 +38,12 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
private Map<String, TASK> mExecuteArray;
|
private Map<String, TASK> mExecuteArray;
|
||||||
private int mSize;
|
private int mSize;
|
||||||
|
|
||||||
public ExecutePool() {
|
public ExecutePool(boolean isDownload) {
|
||||||
mSize = Configuration_1.getInstance().getDownloadNum();
|
if (isDownload) {
|
||||||
|
mSize = AriaManager.getInstance(AriaManager.APP).getDownloadConfig().getMaxTaskNum();
|
||||||
|
} else {
|
||||||
|
mSize = AriaManager.getInstance(AriaManager.APP).getUploadConfig().getMaxTaskNum();
|
||||||
|
}
|
||||||
mExecuteQueue = new ArrayBlockingQueue<>(mSize);
|
mExecuteQueue = new ArrayBlockingQueue<>(mSize);
|
||||||
mExecuteArray = new HashMap<>();
|
mExecuteArray = new HashMap<>();
|
||||||
}
|
}
|
||||||
@ -81,7 +85,6 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
|
|||||||
}
|
}
|
||||||
mExecuteQueue = temp;
|
mExecuteQueue = temp;
|
||||||
mSize = downloadNum;
|
mSize = downloadNum;
|
||||||
Configuration_1.getInstance().setDownloadNum(mSize);
|
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,10 @@ package com.arialyy.aria.core.scheduler;
|
|||||||
import android.os.CountDownTimer;
|
import android.os.CountDownTimer;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import com.arialyy.aria.core.AriaManager;
|
||||||
import com.arialyy.aria.core.queue.DownloadTaskQueue;
|
import com.arialyy.aria.core.queue.DownloadTaskQueue;
|
||||||
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.util.Configuration_1;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -86,7 +86,9 @@ public class DownloadSchedulers implements ISchedulers<DownloadTask> {
|
|||||||
case STOP:
|
case STOP:
|
||||||
case CANCEL:
|
case CANCEL:
|
||||||
mQueue.removeTask(entity);
|
mQueue.removeTask(entity);
|
||||||
if (mQueue.size() < Configuration_1.getInstance().getDownloadNum()) {
|
if (mQueue.size() < AriaManager.getInstance(AriaManager.APP)
|
||||||
|
.getUploadConfig()
|
||||||
|
.getMaxTaskNum()) {
|
||||||
startNextTask();
|
startNextTask();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -163,19 +165,22 @@ public class DownloadSchedulers implements ISchedulers<DownloadTask> {
|
|||||||
* @param task 下载任务
|
* @param task 下载任务
|
||||||
*/
|
*/
|
||||||
private void handleFailTask(final DownloadTask task) {
|
private void handleFailTask(final DownloadTask task) {
|
||||||
final Configuration_1 config = Configuration_1.getInstance();
|
final long interval =
|
||||||
CountDownTimer timer = new CountDownTimer(config.getReTryInterval(), 1000) {
|
AriaManager.getInstance(AriaManager.APP).getUploadConfig().getReTryInterval();
|
||||||
|
final int reTryNum = AriaManager.getInstance(AriaManager.APP).getUploadConfig().getReTryNum();
|
||||||
|
|
||||||
|
CountDownTimer timer = new CountDownTimer(interval, 1000) {
|
||||||
@Override public void onTick(long millisUntilFinished) {
|
@Override public void onTick(long millisUntilFinished) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onFinish() {
|
@Override public void onFinish() {
|
||||||
DownloadEntity entity = task.getDownloadEntity();
|
DownloadEntity entity = task.getDownloadEntity();
|
||||||
if (entity.getFailNum() < config.getReTryNum()) {
|
if (entity.getFailNum() < reTryNum) {
|
||||||
DownloadTask task = mQueue.getTask(entity);
|
DownloadTask task = mQueue.getTask(entity);
|
||||||
mQueue.reTryStart(task);
|
mQueue.reTryStart(task);
|
||||||
try {
|
try {
|
||||||
Thread.sleep(config.getReTryInterval());
|
Thread.sleep(interval);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -18,11 +18,11 @@ package com.arialyy.aria.core.scheduler;
|
|||||||
import android.os.CountDownTimer;
|
import android.os.CountDownTimer;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import com.arialyy.aria.core.AriaManager;
|
||||||
import com.arialyy.aria.core.inf.IEntity;
|
import com.arialyy.aria.core.inf.IEntity;
|
||||||
import com.arialyy.aria.core.queue.UploadTaskQueue;
|
import com.arialyy.aria.core.queue.UploadTaskQueue;
|
||||||
import com.arialyy.aria.core.upload.UploadEntity;
|
import com.arialyy.aria.core.upload.UploadEntity;
|
||||||
import com.arialyy.aria.core.upload.UploadTask;
|
import com.arialyy.aria.core.upload.UploadTask;
|
||||||
import com.arialyy.aria.util.Configuration_1;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -69,19 +69,21 @@ public class UploadSchedulers implements ISchedulers<UploadTask> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleFailTask(final UploadTask task) {
|
private void handleFailTask(final UploadTask task) {
|
||||||
final Configuration_1 config = Configuration_1.getInstance();
|
final long interval =
|
||||||
CountDownTimer timer = new CountDownTimer(config.getReTryInterval(), 1000) {
|
AriaManager.getInstance(AriaManager.APP).getUploadConfig().getReTryInterval();
|
||||||
|
final int reTryNum = AriaManager.getInstance(AriaManager.APP).getUploadConfig().getReTryNum();
|
||||||
|
CountDownTimer timer = new CountDownTimer(interval, 1000) {
|
||||||
@Override public void onTick(long millisUntilFinished) {
|
@Override public void onTick(long millisUntilFinished) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onFinish() {
|
@Override public void onFinish() {
|
||||||
UploadEntity entity = task.getUploadEntity();
|
UploadEntity entity = task.getUploadEntity();
|
||||||
if (entity.getFailNum() <= config.getReTryNum()) {
|
if (entity.getFailNum() <= reTryNum) {
|
||||||
UploadTask task = mQueue.getTask(entity);
|
UploadTask task = mQueue.getTask(entity);
|
||||||
mQueue.reTryStart(task);
|
mQueue.reTryStart(task);
|
||||||
try {
|
try {
|
||||||
Thread.sleep(config.getReTryInterval());
|
Thread.sleep(interval);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -169,7 +171,9 @@ public class UploadSchedulers implements ISchedulers<UploadTask> {
|
|||||||
case STOP:
|
case STOP:
|
||||||
case CANCEL:
|
case CANCEL:
|
||||||
mQueue.removeTask(entity);
|
mQueue.removeTask(entity);
|
||||||
if (mQueue.size() < Configuration_1.getInstance().getDownloadNum()) {
|
if (mQueue.size() < AriaManager.getInstance(AriaManager.APP)
|
||||||
|
.getUploadConfig()
|
||||||
|
.getMaxTaskNum()) {
|
||||||
startNextTask();
|
startNextTask();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -34,8 +34,17 @@ public class UploadEntity extends DbEntity implements IEntity, Parcelable {
|
|||||||
private long currentProgress = 0;
|
private long currentProgress = 0;
|
||||||
private boolean isComplete = false;
|
private boolean isComplete = false;
|
||||||
@Ignore private long speed = 0; //下载速度
|
@Ignore private long speed = 0; //下载速度
|
||||||
|
@Ignore private String convertSpeed = "0/s";
|
||||||
@Ignore private int failNum = 0;
|
@Ignore private int failNum = 0;
|
||||||
|
|
||||||
|
public String getConvertSpeed() {
|
||||||
|
return convertSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConvertSpeed(String convertSpeed) {
|
||||||
|
this.convertSpeed = convertSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isComplete() {
|
public boolean isComplete() {
|
||||||
return isComplete;
|
return isComplete;
|
||||||
}
|
}
|
||||||
@ -115,6 +124,7 @@ public class UploadEntity extends DbEntity implements IEntity, Parcelable {
|
|||||||
dest.writeLong(this.currentProgress);
|
dest.writeLong(this.currentProgress);
|
||||||
dest.writeByte(this.isComplete ? (byte) 1 : (byte) 0);
|
dest.writeByte(this.isComplete ? (byte) 1 : (byte) 0);
|
||||||
dest.writeLong(this.speed);
|
dest.writeLong(this.speed);
|
||||||
|
dest.writeString(this.convertSpeed);
|
||||||
dest.writeInt(this.failNum);
|
dest.writeInt(this.failNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,6 +136,7 @@ public class UploadEntity extends DbEntity implements IEntity, Parcelable {
|
|||||||
this.currentProgress = in.readLong();
|
this.currentProgress = in.readLong();
|
||||||
this.isComplete = in.readByte() != 0;
|
this.isComplete = in.readByte() != 0;
|
||||||
this.speed = in.readLong();
|
this.speed = in.readLong();
|
||||||
|
this.convertSpeed = in.readString();
|
||||||
this.failNum = in.readInt();
|
this.failNum = in.readInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.arialyy.aria.core.upload;
|
package com.arialyy.aria.core.upload;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@ -26,7 +27,6 @@ import com.arialyy.aria.core.inf.ITask;
|
|||||||
import com.arialyy.aria.core.scheduler.DownloadSchedulers;
|
import com.arialyy.aria.core.scheduler.DownloadSchedulers;
|
||||||
import com.arialyy.aria.core.scheduler.ISchedulers;
|
import com.arialyy.aria.core.scheduler.ISchedulers;
|
||||||
import com.arialyy.aria.util.CommonUtil;
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
import com.arialyy.aria.util.Configuration_1;
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -36,19 +36,17 @@ import java.lang.ref.WeakReference;
|
|||||||
public class UploadTask implements ITask {
|
public class UploadTask implements ITask {
|
||||||
private static final String TAG = "UploadTask";
|
private static final String TAG = "UploadTask";
|
||||||
private Handler mOutHandler;
|
private Handler mOutHandler;
|
||||||
private UploadTaskEntity mTaskEntity;
|
|
||||||
private UploadEntity mUploadEntity;
|
private UploadEntity mUploadEntity;
|
||||||
private String mTargetName;
|
private String mTargetName;
|
||||||
|
|
||||||
private UploadUtil mUtil;
|
private UploadUtil mUtil;
|
||||||
private UListener mListener;
|
private UListener mListener;
|
||||||
|
|
||||||
UploadTask(UploadTaskEntity taskEntity, Handler outHandler) {
|
private UploadTask(UploadTaskEntity taskEntity, Handler outHandler) {
|
||||||
mTaskEntity = taskEntity;
|
|
||||||
mOutHandler = outHandler;
|
mOutHandler = outHandler;
|
||||||
mUploadEntity = mTaskEntity.uploadEntity;
|
mUploadEntity = taskEntity.uploadEntity;
|
||||||
mListener = new UListener(mOutHandler, this);
|
mListener = new UListener(mOutHandler, this);
|
||||||
mUtil = new UploadUtil(mTaskEntity, mListener);
|
mUtil = new UploadUtil(taskEntity, mListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void setTargetName(String targetName) {
|
@Override public void setTargetName(String targetName) {
|
||||||
@ -104,31 +102,55 @@ public class UploadTask implements ITask {
|
|||||||
intent.putExtra(Aria.ENTITY, mUploadEntity);
|
intent.putExtra(Aria.ENTITY, mUploadEntity);
|
||||||
AriaManager.APP.sendBroadcast(intent);
|
AriaManager.APP.sendBroadcast(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (mUtil.isRunning()) {
|
|
||||||
// mUtil.cancel();
|
|
||||||
//} else {
|
|
||||||
// // 如果任务不是下载状态
|
|
||||||
// mUtil.cancel();
|
|
||||||
// mUploadEntity.deleteData();
|
|
||||||
// if (mOutHandler != null) {
|
|
||||||
// mOutHandler.obtainMessage(DownloadSchedulers.CANCEL, this).sendToTarget();
|
|
||||||
// }
|
|
||||||
// //发送取消下载的广播
|
|
||||||
// Intent intent = CommonUtil.createIntent(AriaManager.APP.getPackageName(), Aria.ACTION_CANCEL);
|
|
||||||
// intent.putExtra(Aria.ENTITY, mUploadEntity);
|
|
||||||
// AriaManager.APP.sendBroadcast(intent);
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTargetName() {
|
public String getTargetName() {
|
||||||
return mTargetName;
|
return mTargetName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 返回原始byte速度,需要你在配置文件中配置
|
||||||
|
* <pre>
|
||||||
|
* {@code
|
||||||
|
* <xml>
|
||||||
|
* <upload>
|
||||||
|
* ...
|
||||||
|
* <convertSpeed value="false"/>
|
||||||
|
* </upload>
|
||||||
|
*
|
||||||
|
* 或在代码中设置
|
||||||
|
* Aria.get(this).getUploadConfig().setConvertSpeed(false);
|
||||||
|
* </xml>
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
* 才能生效
|
||||||
|
*/
|
||||||
@Override public long getSpeed() {
|
@Override public long getSpeed() {
|
||||||
return mUploadEntity.getSpeed();
|
return mUploadEntity.getSpeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 返回转换单位后的速度,需要你在配置文件中配置,转换完成后为:1b/s、1k/s、1m/s、1g/s、1t/s
|
||||||
|
* <pre>
|
||||||
|
* {@code
|
||||||
|
* <xml>
|
||||||
|
* <upload>
|
||||||
|
* ...
|
||||||
|
* <convertSpeed value="true"/>
|
||||||
|
* </upload>
|
||||||
|
*
|
||||||
|
* 或在代码中设置
|
||||||
|
* Aria.get(this).getUploadConfig().setConvertSpeed(true);
|
||||||
|
* </xml>
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* 才能生效
|
||||||
|
*/
|
||||||
|
@Override public String getConvertSpeed() {
|
||||||
|
return mUploadEntity.getConvertSpeed();
|
||||||
|
}
|
||||||
|
|
||||||
@Override public long getFileSize() {
|
@Override public long getFileSize() {
|
||||||
return mUploadEntity.getFileSize();
|
return mUploadEntity.getFileSize();
|
||||||
}
|
}
|
||||||
@ -144,39 +166,46 @@ public class UploadTask implements ITask {
|
|||||||
long lastTime = 0;
|
long lastTime = 0;
|
||||||
long INTERVAL_TIME = 1000; //1m更新周期
|
long INTERVAL_TIME = 1000; //1m更新周期
|
||||||
boolean isFirst = true;
|
boolean isFirst = true;
|
||||||
UploadEntity entity;
|
UploadEntity uploadEntity;
|
||||||
Intent sendIntent;
|
Intent sendIntent;
|
||||||
|
boolean isOpenBroadCast = false;
|
||||||
|
boolean isConvertSpeed = false;
|
||||||
|
Context context;
|
||||||
|
|
||||||
UListener(Handler outHandle, UploadTask task) {
|
UListener(Handler outHandle, UploadTask task) {
|
||||||
this.outHandler = new WeakReference<>(outHandle);
|
this.outHandler = new WeakReference<>(outHandle);
|
||||||
this.task = new WeakReference<>(task);
|
this.task = new WeakReference<>(task);
|
||||||
entity = this.task.get().getUploadEntity();
|
uploadEntity = this.task.get().getUploadEntity();
|
||||||
sendIntent = CommonUtil.createIntent(AriaManager.APP.getPackageName(), Aria.ACTION_RUNNING);
|
sendIntent = CommonUtil.createIntent(AriaManager.APP.getPackageName(), Aria.ACTION_RUNNING);
|
||||||
sendIntent.putExtra(Aria.ENTITY, entity);
|
sendIntent.putExtra(Aria.ENTITY, uploadEntity);
|
||||||
|
context = AriaManager.APP;
|
||||||
|
final AriaManager manager = AriaManager.getInstance(context);
|
||||||
|
isOpenBroadCast = manager.getUploadConfig().isOpenBreadCast();
|
||||||
|
isConvertSpeed = manager.getUploadConfig().isConvertSpeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onPre() {
|
@Override public void onPre() {
|
||||||
entity.setState(IEntity.STATE_PRE);
|
uploadEntity.setState(IEntity.STATE_PRE);
|
||||||
sendIntent(Aria.ACTION_PRE, -1);
|
sendIntent(Aria.ACTION_PRE, -1);
|
||||||
sendInState2Target(ISchedulers.PRE);
|
sendInState2Target(ISchedulers.PRE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onStart(long fileSize) {
|
@Override public void onStart(long fileSize) {
|
||||||
entity.setFileSize(fileSize);
|
uploadEntity.setFileSize(fileSize);
|
||||||
entity.setState(IEntity.STATE_RUNNING);
|
uploadEntity.setState(IEntity.STATE_RUNNING);
|
||||||
sendIntent(Aria.ACTION_PRE, -1);
|
sendIntent(Aria.ACTION_PRE, -1);
|
||||||
sendInState2Target(ISchedulers.START);
|
sendInState2Target(ISchedulers.START);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onResume(long resumeLocation) {
|
@Override public void onResume(long resumeLocation) {
|
||||||
entity.setState(DownloadEntity.STATE_RUNNING);
|
uploadEntity.setState(DownloadEntity.STATE_RUNNING);
|
||||||
sendInState2Target(DownloadSchedulers.RESUME);
|
sendInState2Target(DownloadSchedulers.RESUME);
|
||||||
sendIntent(Aria.ACTION_RESUME, resumeLocation);
|
sendIntent(Aria.ACTION_RESUME, resumeLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onStop(long stopLocation) {
|
@Override public void onStop(long stopLocation) {
|
||||||
entity.setState(DownloadEntity.STATE_STOP);
|
uploadEntity.setState(DownloadEntity.STATE_STOP);
|
||||||
entity.setSpeed(0);
|
handleSpeed(0);
|
||||||
sendInState2Target(DownloadSchedulers.STOP);
|
sendInState2Target(DownloadSchedulers.STOP);
|
||||||
sendIntent(Aria.ACTION_STOP, stopLocation);
|
sendIntent(Aria.ACTION_STOP, stopLocation);
|
||||||
}
|
}
|
||||||
@ -188,12 +217,11 @@ public class UploadTask implements ITask {
|
|||||||
sendIntent.putExtra(Aria.CURRENT_SPEED, speed);
|
sendIntent.putExtra(Aria.CURRENT_SPEED, speed);
|
||||||
lastTime = System.currentTimeMillis();
|
lastTime = System.currentTimeMillis();
|
||||||
if (isFirst) {
|
if (isFirst) {
|
||||||
entity.setSpeed(0);
|
speed = 0;
|
||||||
isFirst = false;
|
isFirst = false;
|
||||||
} else {
|
|
||||||
entity.setSpeed(speed);
|
|
||||||
}
|
}
|
||||||
entity.setCurrentProgress(currentLocation);
|
handleSpeed(speed);
|
||||||
|
uploadEntity.setCurrentProgress(currentLocation);
|
||||||
lastLen = currentLocation;
|
lastLen = currentLocation;
|
||||||
sendInState2Target(DownloadSchedulers.RUNNING);
|
sendInState2Target(DownloadSchedulers.RUNNING);
|
||||||
AriaManager.APP.sendBroadcast(sendIntent);
|
AriaManager.APP.sendBroadcast(sendIntent);
|
||||||
@ -201,28 +229,37 @@ public class UploadTask implements ITask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onCancel() {
|
@Override public void onCancel() {
|
||||||
entity.setState(DownloadEntity.STATE_CANCEL);
|
uploadEntity.setState(DownloadEntity.STATE_CANCEL);
|
||||||
|
handleSpeed(0);
|
||||||
sendInState2Target(DownloadSchedulers.CANCEL);
|
sendInState2Target(DownloadSchedulers.CANCEL);
|
||||||
sendIntent(Aria.ACTION_CANCEL, -1);
|
sendIntent(Aria.ACTION_CANCEL, -1);
|
||||||
entity.deleteData();
|
uploadEntity.deleteData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onComplete() {
|
@Override public void onComplete() {
|
||||||
entity.setState(DownloadEntity.STATE_COMPLETE);
|
uploadEntity.setState(DownloadEntity.STATE_COMPLETE);
|
||||||
entity.setComplete(true);
|
uploadEntity.setComplete(true);
|
||||||
entity.setSpeed(0);
|
handleSpeed(0);
|
||||||
sendInState2Target(DownloadSchedulers.COMPLETE);
|
sendInState2Target(DownloadSchedulers.COMPLETE);
|
||||||
sendIntent(Aria.ACTION_COMPLETE, entity.getFileSize());
|
sendIntent(Aria.ACTION_COMPLETE, uploadEntity.getFileSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onFail() {
|
@Override public void onFail() {
|
||||||
entity.setFailNum(entity.getFailNum() + 1);
|
uploadEntity.setFailNum(uploadEntity.getFailNum() + 1);
|
||||||
entity.setState(DownloadEntity.STATE_FAIL);
|
uploadEntity.setState(DownloadEntity.STATE_FAIL);
|
||||||
entity.setSpeed(0);
|
handleSpeed(0);
|
||||||
sendInState2Target(DownloadSchedulers.FAIL);
|
sendInState2Target(DownloadSchedulers.FAIL);
|
||||||
sendIntent(Aria.ACTION_FAIL, -1);
|
sendIntent(Aria.ACTION_FAIL, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleSpeed(long speed) {
|
||||||
|
if (isConvertSpeed) {
|
||||||
|
uploadEntity.setConvertSpeed(CommonUtil.formatFileSize(speed) + "/s");
|
||||||
|
} else {
|
||||||
|
uploadEntity.setSpeed(speed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将任务状态发送给下载器
|
* 将任务状态发送给下载器
|
||||||
*
|
*
|
||||||
@ -235,16 +272,16 @@ public class UploadTask implements ITask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void sendIntent(String action, long location) {
|
private void sendIntent(String action, long location) {
|
||||||
entity.setComplete(action.equals(Aria.ACTION_COMPLETE));
|
uploadEntity.setComplete(action.equals(Aria.ACTION_COMPLETE));
|
||||||
entity.setCurrentProgress(location);
|
uploadEntity.setCurrentProgress(location);
|
||||||
entity.update();
|
uploadEntity.update();
|
||||||
if (!Configuration_1.isOpenBreadCast) return;
|
if (!isOpenBroadCast) return;
|
||||||
Intent intent = CommonUtil.createIntent(AriaManager.APP.getPackageName(), action);
|
Intent intent = CommonUtil.createIntent(context.getPackageName(), action);
|
||||||
intent.putExtra(Aria.ENTITY, entity);
|
intent.putExtra(Aria.ENTITY, uploadEntity);
|
||||||
if (location != -1) {
|
if (location != -1) {
|
||||||
intent.putExtra(Aria.CURRENT_LOCATION, location);
|
intent.putExtra(Aria.CURRENT_LOCATION, location);
|
||||||
}
|
}
|
||||||
AriaManager.APP.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,228 +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.util;
|
|
||||||
|
|
||||||
import android.util.Log;
|
|
||||||
import com.arialyy.aria.core.AriaManager;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Properties;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.WeakHashMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by AriaL on 2016/12/8.
|
|
||||||
* 信息配置
|
|
||||||
*/
|
|
||||||
public class Configuration_1 {
|
|
||||||
private static final String TAG = "Configuration_1";
|
|
||||||
private static final String CONFIG_FILE = "/Aria/ADConfig.properties";
|
|
||||||
/**
|
|
||||||
* 当前调度器最大下载数,默认最大下载数为 “2”
|
|
||||||
*/
|
|
||||||
private static final String DOWNLOAD_NUM = "DOWNLOAD_NUM";
|
|
||||||
/**
|
|
||||||
* 失败重试次数,默认最多重试 10 次
|
|
||||||
*/
|
|
||||||
private static final String RE_TRY_NUM = "RE_TRY_NUM";
|
|
||||||
/**
|
|
||||||
* 是否打开下载广播,默认 false
|
|
||||||
*/
|
|
||||||
private static final String OPEN_BROADCAST = "OPEN_BROADCAST";
|
|
||||||
/**
|
|
||||||
* 失败重试间隔时间,默认 4000 ms
|
|
||||||
*/
|
|
||||||
private static final String RE_TRY_INTERVAL = "RE_TRY_INTERVAL";
|
|
||||||
/**
|
|
||||||
* 超时时间,默认 10000 ms
|
|
||||||
*/
|
|
||||||
private static final String DOWNLOAD_TIME_OUT = "DOWNLOAD_TIME_OUT";
|
|
||||||
/**
|
|
||||||
* 设置最大速度
|
|
||||||
*/
|
|
||||||
private static final String MAX_SPEED = "MAX_SPEED";
|
|
||||||
|
|
||||||
public static boolean isOpenBreadCast = false;
|
|
||||||
|
|
||||||
private static Configuration_1 INSTANCE = null;
|
|
||||||
private File mConfigFile = null;
|
|
||||||
private static final Object LOCK = new Object();
|
|
||||||
|
|
||||||
public static Configuration_1 getInstance() {
|
|
||||||
if (INSTANCE == null) {
|
|
||||||
synchronized (LOCK) {
|
|
||||||
INSTANCE = new Configuration_1();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Configuration_1() {
|
|
||||||
mConfigFile = new File(AriaManager.APP.getFilesDir().getPath() + CONFIG_FILE);
|
|
||||||
try {
|
|
||||||
if (!mConfigFile.exists()) {
|
|
||||||
mConfigFile.getParentFile().mkdirs();
|
|
||||||
mConfigFile.createNewFile();
|
|
||||||
init();
|
|
||||||
} else {
|
|
||||||
isOpenBreadCast = isOpenBroadcast();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init() {
|
|
||||||
Map<String, String> config = new WeakHashMap<>();
|
|
||||||
config.put(DOWNLOAD_NUM, 2 + "");
|
|
||||||
config.put(RE_TRY_NUM, 10 + "");
|
|
||||||
config.put(OPEN_BROADCAST, false + "");
|
|
||||||
config.put(RE_TRY_INTERVAL, 4000 + "");
|
|
||||||
config.put(DOWNLOAD_TIME_OUT, 10000 + "");
|
|
||||||
config.put(MAX_SPEED, 64 + "");
|
|
||||||
saveConfig(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void saveConfig(Map<String, String> config) {
|
|
||||||
if (config == null || config.size() == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Properties properties = CommonUtil.loadConfig(mConfigFile);
|
|
||||||
Set<String> keys = config.keySet();
|
|
||||||
for (String key : keys) {
|
|
||||||
properties.setProperty(key, config.get(key));
|
|
||||||
}
|
|
||||||
CommonUtil.saveConfig(mConfigFile, properties);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void save(String key, String value) {
|
|
||||||
Map<String, String> map = new WeakHashMap<>();
|
|
||||||
map.put(key, value);
|
|
||||||
saveConfig(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置最大下载速度
|
|
||||||
*/
|
|
||||||
public void setMaxSpeed(Speed speed) {
|
|
||||||
save(MAX_SPEED, speed.buf + "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取最大速度
|
|
||||||
*/
|
|
||||||
public int getMaxSpeed() {
|
|
||||||
return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(MAX_SPEED, "8192"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取下载超时时间
|
|
||||||
*
|
|
||||||
* @return 默认4000ms
|
|
||||||
*/
|
|
||||||
public int getTimeOut() {
|
|
||||||
return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(DOWNLOAD_TIME_OUT));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置重试间隔
|
|
||||||
*/
|
|
||||||
public void setTimeOut(int timeOut) {
|
|
||||||
if (timeOut < 10000) {
|
|
||||||
Log.w(TAG, "下载超时时间不能小于 10000 ms");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
save(DOWNLOAD_TIME_OUT, timeOut + "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取失败重试间隔时间
|
|
||||||
*
|
|
||||||
* @return 默认4000ms
|
|
||||||
*/
|
|
||||||
public int getReTryInterval() {
|
|
||||||
return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(RE_TRY_INTERVAL));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置重试间隔
|
|
||||||
*/
|
|
||||||
public void setReTryInterval(int reTryInterval) {
|
|
||||||
if (reTryInterval < 4000) {
|
|
||||||
Log.w(TAG, "重试间隔不能小于4000ms");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
save(RE_TRY_INTERVAL, reTryInterval + "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取最大下载数
|
|
||||||
*
|
|
||||||
* @return 默认返回2
|
|
||||||
*/
|
|
||||||
public int getDownloadNum() {
|
|
||||||
return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(DOWNLOAD_NUM));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置最大下载数
|
|
||||||
*/
|
|
||||||
public void setDownloadNum(int downloadNum) {
|
|
||||||
if (downloadNum < 1) {
|
|
||||||
Log.w(TAG, "最大下载数不能小于1");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
save(DOWNLOAD_NUM, downloadNum + "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取最大重试数
|
|
||||||
*
|
|
||||||
* @return 默认返回 10
|
|
||||||
*/
|
|
||||||
public int getReTryNum() {
|
|
||||||
return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(RE_TRY_NUM));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置重试数
|
|
||||||
*/
|
|
||||||
public void setReTryNum(int reTryNum) {
|
|
||||||
if (reTryNum < 1) {
|
|
||||||
Log.w(TAG, "最大下载数不能小于1");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
save(RE_TRY_NUM, reTryNum + "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否打开下载广播
|
|
||||||
*
|
|
||||||
* @return 默认false
|
|
||||||
*/
|
|
||||||
public boolean isOpenBroadcast() {
|
|
||||||
return Boolean.parseBoolean(CommonUtil.loadConfig(mConfigFile).getProperty(RE_TRY_NUM));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置是否打开下载广播
|
|
||||||
*/
|
|
||||||
public void setOpenBroadcast(boolean openBroadcast) {
|
|
||||||
isOpenBreadCast = openBroadcast;
|
|
||||||
save(OPEN_BROADCAST, openBroadcast + "");
|
|
||||||
}
|
|
||||||
}
|
|
@ -15,27 +15,128 @@
|
|||||||
*/
|
*/
|
||||||
package com.arialyy.aria.util;
|
package com.arialyy.aria.util;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.text.TextUtils;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.util.Log;
|
||||||
import android.content.pm.PackageInfo;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.graphics.drawable.Icon;
|
|
||||||
import com.arialyy.aria.window.FileEntity;
|
import com.arialyy.aria.window.FileEntity;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Aria.Lao on 2017/3/21.
|
* Created by Aria.Lao on 2017/3/21.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class FileUtil {
|
public class FileUtil {
|
||||||
|
|
||||||
Context mContext;
|
private static final String TAG = "FileUtil";
|
||||||
|
|
||||||
public FileUtil(Context context) {
|
/**
|
||||||
mContext = context;
|
* 通过流创建文件
|
||||||
|
*/
|
||||||
|
public static void createFileFormInputStream(InputStream is, String path) {
|
||||||
|
try {
|
||||||
|
FileOutputStream fos = new FileOutputStream(path);
|
||||||
|
byte[] buf = new byte[1376];
|
||||||
|
while (is.read(buf) > 0) {
|
||||||
|
fos.write(buf, 0, buf.length);
|
||||||
|
}
|
||||||
|
is.close();
|
||||||
|
fos.flush();
|
||||||
|
fos.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验文件MD5码
|
||||||
|
*/
|
||||||
|
public static boolean checkMD5(String md5, File updateFile) {
|
||||||
|
if (TextUtils.isEmpty(md5) || updateFile == null) {
|
||||||
|
Log.e(TAG, "MD5 string empty or updateFile null");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String calculatedDigest = getFileMD5(updateFile);
|
||||||
|
if (calculatedDigest == null) {
|
||||||
|
Log.e(TAG, "calculatedDigest null");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return calculatedDigest.equalsIgnoreCase(md5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验文件MD5码
|
||||||
|
*/
|
||||||
|
public static boolean checkMD5(String md5, InputStream is) {
|
||||||
|
if (TextUtils.isEmpty(md5) || is == null) {
|
||||||
|
Log.e(TAG, "MD5 string empty or updateFile null");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String calculatedDigest = getFileMD5(is);
|
||||||
|
if (calculatedDigest == null) {
|
||||||
|
Log.e(TAG, "calculatedDigest null");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return calculatedDigest.equalsIgnoreCase(md5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文件MD5码
|
||||||
|
*/
|
||||||
|
public static String getFileMD5(File updateFile) {
|
||||||
|
InputStream is;
|
||||||
|
try {
|
||||||
|
is = new FileInputStream(updateFile);
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
Log.e(TAG, "Exception while getting FileInputStream", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getFileMD5(is);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文件MD5码
|
||||||
|
*/
|
||||||
|
public static String getFileMD5(InputStream is) {
|
||||||
|
MessageDigest digest;
|
||||||
|
try {
|
||||||
|
digest = MessageDigest.getInstance("MD5");
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
Log.e(TAG, "Exception while getting digest", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] buffer = new byte[8192];
|
||||||
|
int read;
|
||||||
|
try {
|
||||||
|
while ((read = is.read(buffer)) > 0) {
|
||||||
|
digest.update(buffer, 0, read);
|
||||||
|
}
|
||||||
|
byte[] md5sum = digest.digest();
|
||||||
|
BigInteger bigInt = new BigInteger(1, md5sum);
|
||||||
|
String output = bigInt.toString(16);
|
||||||
|
// Fill to 32 chars
|
||||||
|
output = String.format("%32s", output).replace(' ', '0');
|
||||||
|
return output;
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Unable to process file for MD5", e);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
is.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "Exception on closing MD5 input stream", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,66 +155,4 @@ public class FileUtil {
|
|||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取文件类型
|
|
||||||
*/
|
|
||||||
public FileType getFileType(String path) {
|
|
||||||
String exName = getExName(path);
|
|
||||||
String type = "";
|
|
||||||
FileType fType = null;
|
|
||||||
if (exName.equalsIgnoreCase("apk")) {
|
|
||||||
fType = new FileType("应用", getApkIcon(path));
|
|
||||||
} else if (exName.equalsIgnoreCase("img")
|
|
||||||
|| exName.equalsIgnoreCase("png")
|
|
||||||
|| exName.equalsIgnoreCase("jpg")
|
|
||||||
|| exName.equalsIgnoreCase("jepg")) {
|
|
||||||
//fType = new FileType("图片", )
|
|
||||||
} else if (exName.equalsIgnoreCase("mp3") || exName.equalsIgnoreCase("wm")) {
|
|
||||||
//fType = new FileType("音乐", );
|
|
||||||
} else if (exName.equalsIgnoreCase("mp4")
|
|
||||||
|| exName.equalsIgnoreCase("rm")
|
|
||||||
|| exName.equalsIgnoreCase("rmvb")) {
|
|
||||||
//fType = new FileType("视频", );
|
|
||||||
}
|
|
||||||
return fType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取扩展名
|
|
||||||
*/
|
|
||||||
public String getExName(String path) {
|
|
||||||
int separatorIndex = path.lastIndexOf(".");
|
|
||||||
return (separatorIndex < 0) ? path : path.substring(separatorIndex + 1, path.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取apk文件的icon
|
|
||||||
*
|
|
||||||
* @param path apk文件路径
|
|
||||||
*/
|
|
||||||
public Drawable getApkIcon(String path) {
|
|
||||||
PackageManager pm = mContext.getPackageManager();
|
|
||||||
PackageInfo info = pm.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES);
|
|
||||||
if (info != null) {
|
|
||||||
ApplicationInfo appInfo = info.applicationInfo;
|
|
||||||
//android有bug,需要下面这两句话来修复才能获取apk图片
|
|
||||||
appInfo.sourceDir = path;
|
|
||||||
appInfo.publicSourceDir = path;
|
|
||||||
// String packageName = appInfo.packageName; //得到安装包名称
|
|
||||||
// String version=info.versionName; //得到版本信息
|
|
||||||
return pm.getApplicationIcon(appInfo);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
class FileType {
|
|
||||||
String name;
|
|
||||||
Drawable icon;
|
|
||||||
|
|
||||||
public FileType(String name, Drawable icon) {
|
|
||||||
this.name = name;
|
|
||||||
this.icon = icon;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
113
Aria/src/main/java/com/arialyy/aria/util/ReflectionUtil.java
Normal file
113
Aria/src/main/java/com/arialyy/aria/util/ReflectionUtil.java
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* 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.util;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by “AriaLyy@outlook.com” on 2015/7/30.
|
||||||
|
* 反射工具类
|
||||||
|
*/
|
||||||
|
public class ReflectionUtil {
|
||||||
|
private static final String TAG = "ReflectionUtil";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取类里面的所在字段
|
||||||
|
*/
|
||||||
|
public static Field[] getFields(Class clazz) {
|
||||||
|
Field[] fields = null;
|
||||||
|
fields = clazz.getDeclaredFields();
|
||||||
|
if (fields == null || fields.length == 0) {
|
||||||
|
Class superClazz = clazz.getSuperclass();
|
||||||
|
if (superClazz != null) {
|
||||||
|
fields = getFields(superClazz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有字段,包括父类的字段
|
||||||
|
*/
|
||||||
|
public static List<Field> getAllFields(Class clazz) {
|
||||||
|
List<Field> fields = new ArrayList<>();
|
||||||
|
Class personClazz = clazz.getSuperclass();
|
||||||
|
if (personClazz != null) {
|
||||||
|
Collections.addAll(fields, personClazz.getDeclaredFields());
|
||||||
|
}
|
||||||
|
Collections.addAll(fields, clazz.getDeclaredFields());
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取类里面的指定对象,如果该类没有则从父类查询
|
||||||
|
*/
|
||||||
|
public static Field getField(Class clazz, String name) {
|
||||||
|
Field field = null;
|
||||||
|
try {
|
||||||
|
field = clazz.getDeclaredField(name);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
try {
|
||||||
|
field = clazz.getField(name);
|
||||||
|
} catch (NoSuchFieldException e1) {
|
||||||
|
if (clazz.getSuperclass() == null) {
|
||||||
|
return field;
|
||||||
|
} else {
|
||||||
|
field = getField(clazz.getSuperclass(), name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (field != null) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
}
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 利用递归找一个类的指定方法,如果找不到,去父亲里面找直到最上层Object对象为止。
|
||||||
|
*
|
||||||
|
* @param clazz 目标类
|
||||||
|
* @param methodName 方法名
|
||||||
|
* @param params 方法参数类型数组
|
||||||
|
* @return 方法对象
|
||||||
|
*/
|
||||||
|
public static Method getMethod(Class clazz, String methodName, final Class<?>... params) {
|
||||||
|
Method method = null;
|
||||||
|
try {
|
||||||
|
method = clazz.getDeclaredMethod(methodName, params);
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
try {
|
||||||
|
method = clazz.getMethod(methodName, params);
|
||||||
|
} catch (NoSuchMethodException ex) {
|
||||||
|
if (clazz.getSuperclass() == null) {
|
||||||
|
Log.e(TAG, "无法找到" + methodName + "方法");
|
||||||
|
return method;
|
||||||
|
} else {
|
||||||
|
method = getMethod(clazz.getSuperclass(), methodName, params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (method != null) {
|
||||||
|
method.setAccessible(true);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
}
|
137
README.md
137
README.md
@ -1,15 +1,20 @@
|
|||||||
# Aria
|
# Aria
|
||||||
</br>
|
</br>
|
||||||
Aria,让上传、下载更容易实现</br>
|
Aria项目源于15年工作中遇到的一个文件下载管理的需求,当时被下载折磨的痛不欲生,从那时起便萌生了编写一个简单易用,稳当高效的下载框架,aria经历了1.0到3.0的开发,算是越来越接近当初所制定的目标了。
|
||||||
|
|
||||||
Aria有以下特点:
|
Aria有以下特点:
|
||||||
- 简单
|
+ 简单、方便
|
||||||
- 可在Dialog、popupWindow等组件中使用
|
- 可以在Activity、Service、Fragment、Dialog、popupWindow、Notification等组件中使用
|
||||||
- 支持多线程、多任务下载
|
- 支持任务自动调度,使用者不需要关心任务状态切换的逻辑
|
||||||
- 支持多任务自动调度
|
- [通过Aria的事件,能很容易获取当前下载任务的下载状态](#下载状态获取)
|
||||||
- 可以直接获取速度
|
- [一句代码加可以获取当前的下载速度](#常用接口)
|
||||||
- 支持https地址下载
|
- [一句代码就可以动态设置最大下载数](#代码中设置参数)
|
||||||
- 支持上传操作
|
- [通过修改配置文件很容易就能修改下载线程数](#配置文件设置参数)
|
||||||
|
+ 支持https地址下载
|
||||||
|
- 在配置文件中很容易就可以设置CA证书的信息
|
||||||
|
+ 支持300、301、302重定向下载链接下载
|
||||||
|
+ 支持上传操作
|
||||||
|
|
||||||
|
|
||||||
Aria怎样使用?
|
Aria怎样使用?
|
||||||
* [下载](#使用)
|
* [下载](#使用)
|
||||||
@ -20,7 +25,7 @@ Aria怎样使用?
|
|||||||
## 下载
|
## 下载
|
||||||
[](https://bintray.com/arialyy/maven/Aria/_latestVersion)</br>
|
[](https://bintray.com/arialyy/maven/Aria/_latestVersion)</br>
|
||||||
```java
|
```java
|
||||||
compile 'com.arialyy.aria:Aria:3.0.3'
|
compile 'com.arialyy.aria:Aria:3.1.0'
|
||||||
```
|
```
|
||||||
|
|
||||||
## 示例
|
## 示例
|
||||||
@ -72,7 +77,8 @@ compile 'com.arialyy.aria:Aria:3.0.3'
|
|||||||
Aria.download(this).load(DOWNLOAD_URL).cancel();
|
Aria.download(this).load(DOWNLOAD_URL).cancel();
|
||||||
```
|
```
|
||||||
|
|
||||||
### 二、如果你希望读取下载进度或下载信息,那么你需要创建事件类,并在onResume(Activity、Fragment)或构造函数(Dialog、PopupWindow),将该事件类注册到Aria管理器。
|
### 下载状态获取
|
||||||
|
如果你希望读取下载进度或下载信息,那么你需要创建事件类,并在onResume(Activity、Fragment)或构造函数(Dialog、PopupWindow),将该事件类注册到Aria管理器。
|
||||||
* 创建事件类
|
* 创建事件类
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@ -104,8 +110,107 @@ compile 'com.arialyy.aria:Aria:3.0.3'
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 关于下载的其它api
|
### Aria参数配置
|
||||||
[Download API](https://github.com/AriaLyy/Aria/blob/master/DownloadApi.md)
|
#### 配置文件设置参数
|
||||||
|
创建`aria_config.xml`文件,将其放在`assets`目录下,添加以下内容
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<aria>
|
||||||
|
|
||||||
|
<!--注意,修改该配置文件中的属性会覆盖代码中所设置的属性-->
|
||||||
|
<download>
|
||||||
|
|
||||||
|
<!--设置下载线程,线程下载数改变后,新的下载任务才会生效-->
|
||||||
|
<threadNum value="4"/>
|
||||||
|
|
||||||
|
<!--是否打开下载广播,默认为false-->
|
||||||
|
<openBroadcast value="false"/>
|
||||||
|
|
||||||
|
<!--设置下载队列最大任务数, 默认为2-->
|
||||||
|
<maxTaskNum value="2"/>
|
||||||
|
|
||||||
|
<!--设置下载失败,重试次数,默认为10-->
|
||||||
|
<reTryNum value="10"/>
|
||||||
|
|
||||||
|
<!--设置重试间隔,单位为毫秒,默认2000毫秒-->
|
||||||
|
<reTryInterval value="2000"/>
|
||||||
|
|
||||||
|
<!--设置url连接超时时间,单位为毫秒,默认5000毫秒-->
|
||||||
|
<connectTimeOut value="5000"/>
|
||||||
|
|
||||||
|
<!--设置IO流读取时间,单位为毫秒,默认20000毫秒,该时间不能少于10000毫秒-->
|
||||||
|
<iOTimeOut value="20000"/>
|
||||||
|
|
||||||
|
<!--设置写文件buff大小,该数值大小不能小于2048,数值变小,下载速度会变慢-->
|
||||||
|
<buffSize value="8192"/>
|
||||||
|
|
||||||
|
<!--设置https ca 证书信息;path 为assets目录下的CA证书完整路径,name 为CA证书名-->
|
||||||
|
<ca name="" path=""/>
|
||||||
|
|
||||||
|
<!--是否需要转换速度单位,转换完成后为:1b/s、1k/s、1m/s、1g/s、1t/s,如果不需要将返回byte长度-->
|
||||||
|
<cnvertSpeed value="false"/>
|
||||||
|
|
||||||
|
</download>
|
||||||
|
|
||||||
|
<upload>
|
||||||
|
<!--是否打开上传广播,默认为false-->
|
||||||
|
<openBroadcast value="false"/>
|
||||||
|
|
||||||
|
<!--设置上传队列最大任务数, 默认为2-->
|
||||||
|
<maxTaskNum value="2"/>
|
||||||
|
|
||||||
|
<!--设置上传失败,重试次数,默认为10-->
|
||||||
|
<reTryNum value="10"/>
|
||||||
|
|
||||||
|
<!--设置重试间隔,单位为毫秒-->
|
||||||
|
<reTryInterval value="2000"/>
|
||||||
|
|
||||||
|
<!--设置url连接超时时间,单位为毫秒,默认5000毫秒-->
|
||||||
|
<connectTimeOut value="5000"/>
|
||||||
|
</upload>
|
||||||
|
|
||||||
|
</aria>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 代码中设置参数
|
||||||
|
除了文件方式外修改Aria参数外,同样的,你也可以在代码中动态修改Aria参数</br>
|
||||||
|
通过`Aria.get(this).getDownloadConfig()`或`Aria.get(this).getUploadConfig()`直接获取配置文件,然后修改参数</br>
|
||||||
|
如以下所示:
|
||||||
|
```java
|
||||||
|
// 修改最大下载数,调用完成后,立即生效
|
||||||
|
// 如当前下载任务数是4,修改完成后,当前任务数会被Aria自动调度任务数
|
||||||
|
Aria.get(this).getDownloadConfig().setMaxTaskNum(3);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 常用接口
|
||||||
|
* 停止所有任务
|
||||||
|
|
||||||
|
```java
|
||||||
|
Aria.download(this).stopAllTask();
|
||||||
|
```
|
||||||
|
* 删除所有任务
|
||||||
|
|
||||||
|
```java
|
||||||
|
Aria.download(this).removeAllTask();
|
||||||
|
```
|
||||||
|
* 获取当前任务的下载速度
|
||||||
|
速度参数有点特殊,需要[下载事件支持](#下载状态获取)
|
||||||
|
``` java
|
||||||
|
@Override public void onTaskRunning(DownloadTask task) {
|
||||||
|
//如果你打开了速度单位转换配置,将可以通过以下方法获取带单位的下载速度,如:1 m/s
|
||||||
|
String convertSpeed = task.getConvertSpeed();
|
||||||
|
//如果你有自己的单位格式,可以通过以下方法获取原始byte长度
|
||||||
|
long speed = task.getSpeed();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
* 获取下载的文件大小
|
||||||
|
同样的,你也可以在DownloadTask对象中获取下载的文件大小
|
||||||
|
```
|
||||||
|
@Override public void onTaskRunning(DownloadTask task) {
|
||||||
|
//获取文件大小
|
||||||
|
long fileSize = task.getFileSize();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
**tips:为了防止内存泄露的情况,事件类需要使用staic进行修饰**
|
**tips:为了防止内存泄露的情况,事件类需要使用staic进行修饰**
|
||||||
|
|
||||||
@ -132,9 +237,7 @@ compile 'com.arialyy.aria:Aria:3.0.3'
|
|||||||
* 取消上传
|
* 取消上传
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Aria.upload(this)
|
Aria.upload(this).load(filePath).cancel();
|
||||||
.load(filePath)
|
|
||||||
.cancel();
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 混淆配置
|
## 混淆配置
|
||||||
@ -148,7 +251,11 @@ compile 'com.arialyy.aria:Aria:3.0.3'
|
|||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
|
## 后续版本开发规划
|
||||||
|
* ~~实现上传队列调度功能~~
|
||||||
|
|
||||||
## 开发日志
|
## 开发日志
|
||||||
|
+ v_3.1.0 添加Aria配置文件,优化代码
|
||||||
+ v_3.0.3 修复暂停后删除任务,闪退问题,添加删除记录的api
|
+ v_3.0.3 修复暂停后删除任务,闪退问题,添加删除记录的api
|
||||||
+ v_3.0.2 支持30x重定向链接下载
|
+ v_3.0.2 支持30x重定向链接下载
|
||||||
+ v_3.0.0 添加上传任务支持,修复一些已发现的bug
|
+ v_3.0.0 添加上传任务支持,修复一些已发现的bug
|
||||||
|
@ -1,13 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<aria>
|
<aria>
|
||||||
|
|
||||||
|
<!--注意,修改该配置文件中的属性会覆盖代码中所设置的属性-->
|
||||||
<download>
|
<download>
|
||||||
|
|
||||||
|
<!--设置下载线程,线程下载数改变后,新的下载任务才会生效-->
|
||||||
|
<threadNum value="4"/>
|
||||||
|
|
||||||
<!--是否打开下载广播,默认为false-->
|
<!--是否打开下载广播,默认为false-->
|
||||||
<openBroadcast value="false"/>
|
<openBroadcast value="false"/>
|
||||||
|
|
||||||
<!--设置下载队列最大任务数, 默认为2-->
|
<!--设置下载队列最大任务数, 默认为2-->
|
||||||
<maxQueueNum value="2"/>
|
<maxTaskNum value="2"/>
|
||||||
|
|
||||||
<!--设置下载失败,重试次数,默认为10-->
|
<!--设置下载失败,重试次数,默认为10-->
|
||||||
<reTryNum value="10"/>
|
<reTryNum value="10"/>
|
||||||
@ -15,8 +19,11 @@
|
|||||||
<!--设置重试间隔,单位为毫秒,默认2000毫秒-->
|
<!--设置重试间隔,单位为毫秒,默认2000毫秒-->
|
||||||
<reTryInterval value="2000"/>
|
<reTryInterval value="2000"/>
|
||||||
|
|
||||||
|
<!--设置url连接超时时间,单位为毫秒,默认5000毫秒-->
|
||||||
|
<connectTimeOut value="5000"/>
|
||||||
|
|
||||||
<!--设置IO流读取时间,单位为毫秒,默认20000毫秒,该时间不能少于10000毫秒-->
|
<!--设置IO流读取时间,单位为毫秒,默认20000毫秒,该时间不能少于10000毫秒-->
|
||||||
<readTimeout value="20000"/>
|
<iOTimeOut value="20000"/>
|
||||||
|
|
||||||
<!--设置写文件buff大小,该数值大小不能小于2048,数值变小,下载速度会变慢-->
|
<!--设置写文件buff大小,该数值大小不能小于2048,数值变小,下载速度会变慢-->
|
||||||
<buffSize value="8192"/>
|
<buffSize value="8192"/>
|
||||||
@ -24,6 +31,9 @@
|
|||||||
<!--设置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长度-->
|
||||||
|
<convertSpeed value="true"/>
|
||||||
|
|
||||||
</download>
|
</download>
|
||||||
|
|
||||||
<upload>
|
<upload>
|
||||||
@ -31,7 +41,7 @@
|
|||||||
<openBroadcast value="false"/>
|
<openBroadcast value="false"/>
|
||||||
|
|
||||||
<!--设置上传队列最大任务数, 默认为2-->
|
<!--设置上传队列最大任务数, 默认为2-->
|
||||||
<maxQueueNum value="2"/>
|
<maxTaskNum value="2"/>
|
||||||
|
|
||||||
<!--设置上传失败,重试次数,默认为10-->
|
<!--设置上传失败,重试次数,默认为10-->
|
||||||
<reTryNum value="10"/>
|
<reTryNum value="10"/>
|
||||||
|
@ -22,6 +22,7 @@ import android.support.v7.widget.Toolbar;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import butterknife.Bind;
|
import butterknife.Bind;
|
||||||
import butterknife.OnClick;
|
import butterknife.OnClick;
|
||||||
|
import com.arialyy.aria.core.Aria;
|
||||||
import com.arialyy.simple.base.BaseActivity;
|
import com.arialyy.simple.base.BaseActivity;
|
||||||
import com.arialyy.simple.databinding.ActivityMainBinding;
|
import com.arialyy.simple.databinding.ActivityMainBinding;
|
||||||
import com.arialyy.simple.download.DownloadActivity;
|
import com.arialyy.simple.download.DownloadActivity;
|
||||||
|
@ -44,7 +44,7 @@ public class DownloadDialog extends AbsDialog {
|
|||||||
@Bind(R.id.speed) TextView mSpeed;
|
@Bind(R.id.speed) TextView mSpeed;
|
||||||
|
|
||||||
private static final String DOWNLOAD_URL =
|
private static final String DOWNLOAD_URL =
|
||||||
"http://static.gaoshouyou.com/d/3a/93/573ae1db9493a801c24bf66128b11e39.apk";
|
"http://clashroyalecdn.static.kunlun.com/Clash_Royale-1.2.6-kunlun_landing_page-release.apk.apk";
|
||||||
|
|
||||||
public DownloadDialog(Context context) {
|
public DownloadDialog(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@ -110,14 +110,14 @@ public class DownloadDialog extends AbsDialog {
|
|||||||
@Override public void onTaskStop(DownloadTask task) {
|
@Override public void onTaskStop(DownloadTask task) {
|
||||||
super.onTaskStop(task);
|
super.onTaskStop(task);
|
||||||
setBtState(true);
|
setBtState(true);
|
||||||
mSpeed.setText("0.0kb/s");
|
mSpeed.setText(task.getConvertSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onTaskCancel(DownloadTask task) {
|
@Override public void onTaskCancel(DownloadTask task) {
|
||||||
super.onTaskCancel(task);
|
super.onTaskCancel(task);
|
||||||
setBtState(true);
|
setBtState(true);
|
||||||
mPb.setProgress(0);
|
mPb.setProgress(0);
|
||||||
mSpeed.setText("0.0kb/s");
|
mSpeed.setText(task.getConvertSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onTaskRunning(DownloadTask task) {
|
@Override public void onTaskRunning(DownloadTask task) {
|
||||||
@ -129,7 +129,7 @@ public class DownloadDialog extends AbsDialog {
|
|||||||
} else {
|
} else {
|
||||||
mPb.setProgress((int) ((current * 100) / len));
|
mPb.setProgress((int) ((current * 100) / len));
|
||||||
}
|
}
|
||||||
mSpeed.setText(CommonUtil.formatFileSize(task.getSpeed()) + "/s");
|
mSpeed.setText(task.getConvertSpeed());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ public class DownloadPopupWindow extends AbsPopupWindow {
|
|||||||
} else {
|
} else {
|
||||||
mPb.setProgress((int) ((current * 100) / len));
|
mPb.setProgress((int) ((current * 100) / len));
|
||||||
}
|
}
|
||||||
mSpeed.setText(CommonUtil.formatFileSize(task.getSpeed()) + "/s");
|
mSpeed.setText(task.getConvertSpeed());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
} else {
|
} else {
|
||||||
mPb.setProgress((int) ((current * 100) / len));
|
mPb.setProgress((int) ((current * 100) / len));
|
||||||
}
|
}
|
||||||
mSpeed.setText(CommonUtil.formatFileSize(task.getSpeed()) + "/s");
|
mSpeed.setText(task.getConvertSpeed());
|
||||||
break;
|
break;
|
||||||
case DOWNLOAD_PRE:
|
case DOWNLOAD_PRE:
|
||||||
mSize.setText(CommonUtil.formatFileSize((Long) msg.obj));
|
mSize.setText(CommonUtil.formatFileSize((Long) msg.obj));
|
||||||
@ -164,7 +164,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
toolbar.setTitle("单任务下载");
|
toolbar.setTitle("单任务下载");
|
||||||
init();
|
init();
|
||||||
Aria.get(this).openBroadcast(true);
|
Aria.get(this).getDownloadConfig().setOpenBreadCast(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init() {
|
private void init() {
|
||||||
@ -173,33 +173,33 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
int p = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
|
int p = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
|
||||||
mPb.setProgress(p);
|
mPb.setProgress(p);
|
||||||
}
|
}
|
||||||
mRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
|
//mRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
|
||||||
@Override public void onCheckedChanged(RadioGroup group, int checkedId) {
|
// @Override public void onCheckedChanged(RadioGroup group, int checkedId) {
|
||||||
switch (checkedId) {
|
// switch (checkedId) {
|
||||||
case 1:
|
// case 1:
|
||||||
Aria.get(this).setMaxSpeed(Speed.KB_256);
|
// Aria.get(this).setMaxSpeed(Speed.KB_256);
|
||||||
break;
|
// break;
|
||||||
case 2:
|
// case 2:
|
||||||
Aria.get(this).setMaxSpeed(Speed.KB_512);
|
// Aria.get(this).setMaxSpeed(Speed.KB_512);
|
||||||
break;
|
// break;
|
||||||
case 3:
|
// case 3:
|
||||||
Aria.get(this).setMaxSpeed(Speed.MB_1);
|
// Aria.get(this).setMaxSpeed(Speed.MB_1);
|
||||||
break;
|
// break;
|
||||||
case 4:
|
// case 4:
|
||||||
Aria.get(this).setMaxSpeed(Speed.MB_2);
|
// Aria.get(this).setMaxSpeed(Speed.MB_2);
|
||||||
break;
|
// break;
|
||||||
case 5:
|
// case 5:
|
||||||
Aria.get(this).setMaxSpeed(Speed.MAX);
|
// Aria.get(this).setMaxSpeed(Speed.MAX);
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
stop();
|
// stop();
|
||||||
new Handler().postDelayed(new Runnable() {
|
// new Handler().postDelayed(new Runnable() {
|
||||||
@Override public void run() {
|
// @Override public void run() {
|
||||||
start();
|
// start();
|
||||||
}
|
// }
|
||||||
}, 2000);
|
// }, 2000);
|
||||||
}
|
// }
|
||||||
});
|
//});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
|
@ -45,7 +45,7 @@ public class DownloadFragment extends AbsFragment<FragmentDownloadBinding> {
|
|||||||
@Bind(R.id.speed) TextView mSpeed;
|
@Bind(R.id.speed) TextView mSpeed;
|
||||||
|
|
||||||
private static final String DOWNLOAD_URL =
|
private static final String DOWNLOAD_URL =
|
||||||
"http://static.gaoshouyou.com/d/3a/93/573ae1db9493a801c24bf66128b11e39.apk";
|
"http://rs.0.gaoshouyou.com/d/90/d7/7490c6fd6cd733bef336e766778507c5.apk";
|
||||||
|
|
||||||
@Override protected void init(Bundle savedInstanceState) {
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
|
if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
|
||||||
@ -74,7 +74,6 @@ public class DownloadFragment extends AbsFragment<FragmentDownloadBinding> {
|
|||||||
Aria.download(this)
|
Aria.download(this)
|
||||||
.load(DOWNLOAD_URL)
|
.load(DOWNLOAD_URL)
|
||||||
.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/daialog.apk")
|
.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/daialog.apk")
|
||||||
.setDownloadName("daialog.apk")
|
|
||||||
.start();
|
.start();
|
||||||
break;
|
break;
|
||||||
case R.id.stop:
|
case R.id.stop:
|
||||||
@ -134,7 +133,7 @@ public class DownloadFragment extends AbsFragment<FragmentDownloadBinding> {
|
|||||||
} else {
|
} else {
|
||||||
mPb.setProgress((int) ((current * 100) / len));
|
mPb.setProgress((int) ((current * 100) / len));
|
||||||
}
|
}
|
||||||
mSpeed.setText(CommonUtil.formatFileSize(task.getSpeed()) + "/s");
|
mSpeed.setText(task.getConvertSpeed());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,6 @@ final class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapter
|
|||||||
long size = item.getFileSize();
|
long size = item.getFileSize();
|
||||||
int current = 0;
|
int current = 0;
|
||||||
long progress = item.getCurrentProgress();
|
long progress = item.getCurrentProgress();
|
||||||
long speed = item.getSpeed();
|
|
||||||
current = size == 0 ? 0 : (int) (progress * 100 / size);
|
current = size == 0 ? 0 : (int) (progress * 100 / size);
|
||||||
holder.progress.setProgress(current);
|
holder.progress.setProgress(current);
|
||||||
BtClickListener listener = new BtClickListener(item);
|
BtClickListener listener = new BtClickListener(item);
|
||||||
@ -136,7 +135,7 @@ final class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapter
|
|||||||
}
|
}
|
||||||
holder.bt.setText(str);
|
holder.bt.setText(str);
|
||||||
holder.bt.setTextColor(getColor(color));
|
holder.bt.setTextColor(getColor(color));
|
||||||
holder.speed.setText(CommonUtil.formatFileSize(speed) + "/s");
|
holder.speed.setText(item.getConvertSpeed());
|
||||||
holder.fileSize.setText(covertCurrentSize(progress) + "/" + CommonUtil.formatFileSize(size));
|
holder.fileSize.setText(covertCurrentSize(progress) + "/" + CommonUtil.formatFileSize(size));
|
||||||
holder.cancel.setOnClickListener(new View.OnClickListener() {
|
holder.cancel.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override public void onClick(View v) {
|
@Override public void onClick(View v) {
|
||||||
@ -147,10 +146,6 @@ final class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapter
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDownloadNum(int num) {
|
|
||||||
Aria.get(getContext()).setMaxDownloadNum(num);
|
|
||||||
}
|
|
||||||
|
|
||||||
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() - 1);
|
||||||
|
@ -83,7 +83,7 @@ public class MultiTaskActivity extends BaseActivity<ActivityMultiBinding> {
|
|||||||
@Override protected void dataCallback(int result, Object data) {
|
@Override protected void dataCallback(int result, Object data) {
|
||||||
super.dataCallback(result, data);
|
super.dataCallback(result, data);
|
||||||
if (result == DownloadNumDialog.RESULT_CODE) {
|
if (result == DownloadNumDialog.RESULT_CODE) {
|
||||||
Aria.get(this).setMaxDownloadNum(Integer.parseInt(data + ""));
|
Aria.get(this).getDownloadConfig().setMaxTaskNum(Integer.parseInt(data + ""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,11 +31,7 @@ import com.arialyy.frame.util.show.T;
|
|||||||
public class DownloadService extends Service {
|
public class DownloadService extends Service {
|
||||||
|
|
||||||
private static final String DOWNLOAD_URL =
|
private static final String DOWNLOAD_URL =
|
||||||
//"http://kotlinlang.org/docs/kotlin-docs.pdf";
|
"http://rs.0.gaoshouyou.com/d/df/db/03df9eab61dbc48a5939f671f05f1cdf.apk";
|
||||||
//"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe";
|
|
||||||
//"http://static.gaoshouyou.com/d/21/e8/61218d78d0e8b79df68dbc18dd484c97.apk";
|
|
||||||
//不支持断点的链接
|
|
||||||
"http://ox.konsung.net:5555/ksdc-web/download/downloadFile/?fileName=ksdc_1.0.2.apk&rRange=0-";
|
|
||||||
private DownloadNotification mNotify;
|
private DownloadNotification mNotify;
|
||||||
|
|
||||||
@Nullable @Override public IBinder onBind(Intent intent) {
|
@Nullable @Override public IBinder onBind(Intent intent) {
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="download_url">
|
<string-array name="download_url">
|
||||||
<item>http://g37.gdl.netease.com/onmyoji_netease_1.apk</item>
|
<item>https://g37.gdl.netease.com/onmyoji_netease_10_1.0.20.apk</item>
|
||||||
<item>http://static.gaoshouyou.com/d/eb/f2/dfeba30541f209ab8a50d847fc1661ce.apk</item>
|
<item>http://static.gaoshouyou.com/d/eb/f2/dfeba30541f209ab8a50d847fc1661ce.apk</item>
|
||||||
<item>http://rs.0.gaoshouyou.com/d/51/46/58514d126c46b8a3f27fc8c7db3b09ec.apk</item>
|
<item>http://rs.0.gaoshouyou.com/d/51/46/58514d126c46b8a3f27fc8c7db3b09ec.apk</item>
|
||||||
<item>http://rs.0.gaoshouyou.com/d/23/69/07238f952669727878d7a0e180534c8b.apk</item>
|
<item>http://rs.0.gaoshouyou.com/d/23/69/07238f952669727878d7a0e180534c8b.apk</item>
|
||||||
|
@ -13,7 +13,3 @@
|
|||||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
# org.gradle.parallel=true
|
# org.gradle.parallel=true
|
||||||
#Wed Dec 07 20:19:22 CST 2016
|
#Wed Dec 07 20:19:22 CST 2016
|
||||||
systemProp.http.proxyPassword=7RbgsDfOoBn
|
|
||||||
systemProp.http.proxyHost=hilton.h.xduotai.com
|
|
||||||
systemProp.http.proxyUser=duotai
|
|
||||||
systemProp.http.proxyPort=10969
|
|
||||||
|
Reference in New Issue
Block a user