任务实体优化
This commit is contained in:
34
Aria/src/main/java/com/arialyy/aria/core/UrlMapping.java
Normal file
34
Aria/src/main/java/com/arialyy/aria/core/UrlMapping.java
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* 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 com.arialyy.aria.orm.DbEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by lyy on 2017/10/17.
|
||||||
|
* Url 映射表
|
||||||
|
*/
|
||||||
|
public class UrlMapping extends DbEntity {
|
||||||
|
/**
|
||||||
|
* 各实体对应的key
|
||||||
|
*/
|
||||||
|
public String key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 链接
|
||||||
|
*/
|
||||||
|
public String url;
|
||||||
|
}
|
@@ -88,7 +88,6 @@ public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY ext
|
|||||||
if (mSize != 0 && !isUpload) {
|
if (mSize != 0 && !isUpload) {
|
||||||
mEntity.setFileSize(mSize);
|
mEntity.setFileSize(mSize);
|
||||||
}
|
}
|
||||||
mEntity.update();
|
|
||||||
mTaskEntity.update();
|
mTaskEntity.update();
|
||||||
onPreComplete(reply);
|
onPreComplete(reply);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@@ -143,22 +143,17 @@ class BaseDListener<ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskEntity<
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void saveData(int state, long location) {
|
private void saveData(int state, long location) {
|
||||||
mEntity.setComplete(state == IEntity.STATE_COMPLETE);
|
|
||||||
mTaskEntity.state = state;
|
mTaskEntity.state = state;
|
||||||
|
mEntity.setState(state);
|
||||||
|
mEntity.setComplete(state == IEntity.STATE_COMPLETE);
|
||||||
if (state == IEntity.STATE_CANCEL) {
|
if (state == IEntity.STATE_CANCEL) {
|
||||||
mEntity.setState(state);
|
mTaskEntity.deleteData();
|
||||||
mEntity.deleteData();
|
return;
|
||||||
} else if (state == IEntity.STATE_COMPLETE) {
|
} else if (mEntity.isComplete()) {
|
||||||
mEntity.setState(state);
|
|
||||||
mEntity.setCompleteTime(System.currentTimeMillis());
|
mEntity.setCompleteTime(System.currentTimeMillis());
|
||||||
mEntity.setCurrentProgress(mEntity.getFileSize());
|
mEntity.setCurrentProgress(mEntity.getFileSize());
|
||||||
mEntity.update();
|
} else if (location > 0) {
|
||||||
} else {
|
mEntity.setCurrentProgress(location);
|
||||||
mEntity.setState(state);
|
|
||||||
if (location != -1) {
|
|
||||||
mEntity.setCurrentProgress(location);
|
|
||||||
}
|
|
||||||
mEntity.update();
|
|
||||||
}
|
}
|
||||||
mTaskEntity.update();
|
mTaskEntity.update();
|
||||||
}
|
}
|
||||||
|
@@ -55,7 +55,6 @@ abstract class BaseGroupTarget<TARGET extends AbsTarget, TASK_ENTITY extends Abs
|
|||||||
entity = new DownloadGroupEntity();
|
entity = new DownloadGroupEntity();
|
||||||
entity.setGroupName(mGroupName);
|
entity.setGroupName(mGroupName);
|
||||||
entity.setUrls(mUrls);
|
entity.setUrls(mUrls);
|
||||||
entity.insert();
|
|
||||||
}
|
}
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
@@ -49,13 +49,10 @@ public class DownloadGroupTarget
|
|||||||
mTaskEntity = DbEntity.findFirst(DownloadGroupTaskEntity.class, "key=?", key);
|
mTaskEntity = DbEntity.findFirst(DownloadGroupTaskEntity.class, "key=?", key);
|
||||||
if (mTaskEntity == null) {
|
if (mTaskEntity == null) {
|
||||||
mTaskEntity = new DownloadGroupTaskEntity();
|
mTaskEntity = new DownloadGroupTaskEntity();
|
||||||
mTaskEntity.key = key;
|
mTaskEntity.save(getDownloadGroupEntity());
|
||||||
mTaskEntity.entity = getDownloadGroupEntity();
|
|
||||||
mTaskEntity.insert();
|
|
||||||
}
|
}
|
||||||
if (mTaskEntity.entity == null || TextUtils.isEmpty(mTaskEntity.entity.getKey())) {
|
if (mTaskEntity.entity == null || TextUtils.isEmpty(mTaskEntity.entity.getKey())) {
|
||||||
mTaskEntity.entity = getDownloadGroupEntity();
|
mTaskEntity.save(getDownloadGroupEntity());
|
||||||
mTaskEntity.save();
|
|
||||||
}
|
}
|
||||||
mEntity = mTaskEntity.entity;
|
mEntity = mTaskEntity.entity;
|
||||||
}
|
}
|
||||||
|
@@ -28,4 +28,12 @@ public class DownloadGroupTaskEntity extends AbsGroupTaskEntity<DownloadGroupEnt
|
|||||||
@Override public DownloadGroupEntity getEntity() {
|
@Override public DownloadGroupEntity getEntity() {
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void save(DownloadGroupEntity groupEntity){
|
||||||
|
key = groupEntity.getKey();
|
||||||
|
entity = groupEntity;
|
||||||
|
groupEntity.save();
|
||||||
|
save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -61,20 +61,13 @@ public class DownloadTarget
|
|||||||
entity.getDownloadPath(), entity.getUrl());
|
entity.getDownloadPath(), entity.getUrl());
|
||||||
if (mTaskEntity == null) {
|
if (mTaskEntity == null) {
|
||||||
mTaskEntity = new DownloadTaskEntity();
|
mTaskEntity = new DownloadTaskEntity();
|
||||||
mTaskEntity.url = entity.getUrl();
|
mTaskEntity.save(entity);
|
||||||
mTaskEntity.key = entity.getDownloadPath();
|
|
||||||
mTaskEntity.entity = entity;
|
|
||||||
mTaskEntity.save();
|
|
||||||
} else if (mTaskEntity.entity == null || TextUtils.isEmpty(mTaskEntity.entity.getUrl())) {
|
} else if (mTaskEntity.entity == null || TextUtils.isEmpty(mTaskEntity.entity.getUrl())) {
|
||||||
mTaskEntity.entity = entity;
|
mTaskEntity.save(entity);
|
||||||
mTaskEntity.save();
|
|
||||||
} else if (!mTaskEntity.entity.getUrl().equals(entity.getUrl())) { //处理地址切换而保存路径不变
|
} else if (!mTaskEntity.entity.getUrl().equals(entity.getUrl())) { //处理地址切换而保存路径不变
|
||||||
mTaskEntity.entity.deleteData();
|
mTaskEntity.save(entity);
|
||||||
mTaskEntity.entity = entity;
|
|
||||||
entity.save();
|
|
||||||
mTaskEntity.save();
|
|
||||||
}
|
}
|
||||||
mEntity = mTaskEntity.entity;
|
mEntity = entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -175,7 +175,6 @@ public class DownloadTask extends AbsNormalTask<DownloadTaskEntity> {
|
|||||||
public DownloadTask build() {
|
public DownloadTask build() {
|
||||||
DownloadTask task = new DownloadTask(taskEntity, outHandler);
|
DownloadTask task = new DownloadTask(taskEntity, outHandler);
|
||||||
task.setTargetName(targetName);
|
task.setTargetName(targetName);
|
||||||
taskEntity.getEntity().save();
|
|
||||||
taskEntity.save();
|
taskEntity.save();
|
||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
@@ -18,6 +18,7 @@ package com.arialyy.aria.core.download;
|
|||||||
import com.arialyy.aria.core.inf.AbsNormalTaskEntity;
|
import com.arialyy.aria.core.inf.AbsNormalTaskEntity;
|
||||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||||
import com.arialyy.aria.orm.Ignore;
|
import com.arialyy.aria.orm.Ignore;
|
||||||
|
import com.arialyy.aria.orm.NoNull;
|
||||||
import com.arialyy.aria.orm.OneToOne;
|
import com.arialyy.aria.orm.OneToOne;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -31,7 +32,7 @@ public class DownloadTaskEntity extends AbsNormalTaskEntity<DownloadEntity> {
|
|||||||
/**
|
/**
|
||||||
* 任务的url
|
* 任务的url
|
||||||
*/
|
*/
|
||||||
public String url = "";
|
@NoNull public String url = "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 所属的任务组组名,如果不属于任务组,则为null
|
* 所属的任务组组名,如果不属于任务组,则为null
|
||||||
@@ -49,4 +50,12 @@ public class DownloadTaskEntity extends AbsNormalTaskEntity<DownloadEntity> {
|
|||||||
@Override public DownloadEntity getEntity() {
|
@Override public DownloadEntity getEntity() {
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void save(DownloadEntity entity) {
|
||||||
|
url = entity.getUrl();
|
||||||
|
key = entity.getDownloadPath();
|
||||||
|
this.entity = entity;
|
||||||
|
entity.save();
|
||||||
|
save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -50,12 +50,10 @@ public class FtpDirDownloadTarget
|
|||||||
mTaskEntity = DbEntity.findFirst(DownloadGroupTaskEntity.class, "key=?", key);
|
mTaskEntity = DbEntity.findFirst(DownloadGroupTaskEntity.class, "key=?", key);
|
||||||
if (mTaskEntity == null) {
|
if (mTaskEntity == null) {
|
||||||
mTaskEntity = new DownloadGroupTaskEntity();
|
mTaskEntity = new DownloadGroupTaskEntity();
|
||||||
mTaskEntity.key = key;
|
mTaskEntity.save(getDownloadGroupEntity());
|
||||||
mTaskEntity.entity = getDownloadGroupEntity();
|
|
||||||
mTaskEntity.insert();
|
|
||||||
}
|
}
|
||||||
if (mTaskEntity.entity == null) {
|
if (mTaskEntity.entity == null) {
|
||||||
mTaskEntity.entity = getDownloadGroupEntity();
|
mTaskEntity.save(getDownloadGroupEntity());
|
||||||
}
|
}
|
||||||
mEntity = mTaskEntity.entity;
|
mEntity = mTaskEntity.entity;
|
||||||
}
|
}
|
||||||
|
@@ -75,7 +75,6 @@ public class FtpDownloadTarget extends DownloadTarget {
|
|||||||
mEntity.setDownloadPath(downloadPath);
|
mEntity.setDownloadPath(downloadPath);
|
||||||
mEntity.setFileName(newFile.getName());
|
mEntity.setFileName(newFile.getName());
|
||||||
mTaskEntity.key = downloadPath;
|
mTaskEntity.key = downloadPath;
|
||||||
mEntity.update();
|
|
||||||
mTaskEntity.update();
|
mTaskEntity.update();
|
||||||
CommonUtil.renameDownloadConfig(oldFile.getName(), newFile.getName());
|
CommonUtil.renameDownloadConfig(oldFile.getName(), newFile.getName());
|
||||||
}
|
}
|
||||||
|
@@ -169,25 +169,25 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
* @param url 子任务下载地址
|
* @param url 子任务下载地址
|
||||||
*/
|
*/
|
||||||
public void cancelSubTask(String url) {
|
public void cancelSubTask(String url) {
|
||||||
//List<String> urls = mTaskEntity.entity.getUrls();
|
List<String> urls = mTaskEntity.entity.getUrls();
|
||||||
//if (urls != null && !urls.isEmpty() && urls.contains(url)) {
|
if (urls != null && !urls.isEmpty() && urls.contains(url)) {
|
||||||
// urls.remove(url);
|
urls.remove(url);
|
||||||
// DownloadTaskEntity det =
|
DownloadTaskEntity det =
|
||||||
// DbEntity.findFirst(DownloadTaskEntity.class, "url=? and isGroupTask='true'", url);
|
DbEntity.findFirst(DownloadTaskEntity.class, "url=? and isGroupTask='true'", url);
|
||||||
// if (det != null) {
|
if (det != null) {
|
||||||
// mTotalLen -= det.getEntity().getFileSize();
|
mTotalLen -= det.getEntity().getFileSize();
|
||||||
// mGroupSize--;
|
mGroupSize--;
|
||||||
// if (mGroupSize == 0) {
|
if (mGroupSize == 0) {
|
||||||
// closeTimer(false);
|
closeTimer(false);
|
||||||
// mListener.onCancel();
|
mListener.onCancel();
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// mTaskEntity.getEntity().update();
|
mTaskEntity.update();
|
||||||
//}
|
}
|
||||||
//Downloader d = getDownloader(url, false);
|
Downloader d = getDownloader(url, false);
|
||||||
//if (d != null) {
|
if (d != null) {
|
||||||
// d.cancel();
|
d.cancel();
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -416,19 +416,18 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
* 子任务事件监听
|
* 子任务事件监听
|
||||||
*/
|
*/
|
||||||
private class ChildDownloadListener implements IDownloadListener {
|
private class ChildDownloadListener implements IDownloadListener {
|
||||||
|
private DownloadTaskEntity subTaskEntity;
|
||||||
DownloadTaskEntity taskEntity;
|
private DownloadEntity subEntity;
|
||||||
DownloadEntity entity;
|
|
||||||
private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度
|
private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度
|
||||||
private long mLastSaveTime;
|
private long lastSaveTime;
|
||||||
long lastLen = 0;
|
private long lastLen = 0;
|
||||||
|
|
||||||
ChildDownloadListener(DownloadTaskEntity entity) {
|
ChildDownloadListener(DownloadTaskEntity entity) {
|
||||||
this.taskEntity = entity;
|
subTaskEntity = entity;
|
||||||
this.entity = taskEntity.getEntity();
|
subEntity = subTaskEntity.getEntity();
|
||||||
this.entity.setFailNum(0);
|
subEntity.setFailNum(0);
|
||||||
lastLen = this.entity.getCurrentProgress();
|
lastLen = subEntity.getCurrentProgress();
|
||||||
mLastSaveTime = System.currentTimeMillis();
|
lastSaveTime = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onPre() {
|
@Override public void onPre() {
|
||||||
@@ -436,33 +435,33 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onPostPre(long fileSize) {
|
@Override public void onPostPre(long fileSize) {
|
||||||
entity.setFileSize(fileSize);
|
subEntity.setFileSize(fileSize);
|
||||||
entity.setConvertFileSize(CommonUtil.formatFileSize(fileSize));
|
subEntity.setConvertFileSize(CommonUtil.formatFileSize(fileSize));
|
||||||
saveData(IEntity.STATE_POST_PRE, -1);
|
saveData(IEntity.STATE_POST_PRE, -1);
|
||||||
mListener.onSubPre(entity);
|
mListener.onSubPre(subEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onResume(long resumeLocation) {
|
@Override public void onResume(long resumeLocation) {
|
||||||
saveData(IEntity.STATE_POST_PRE, IEntity.STATE_RUNNING);
|
saveData(IEntity.STATE_POST_PRE, IEntity.STATE_RUNNING);
|
||||||
lastLen = resumeLocation;
|
lastLen = resumeLocation;
|
||||||
mListener.onSubStart(entity);
|
mListener.onSubStart(subEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onStart(long startLocation) {
|
@Override public void onStart(long startLocation) {
|
||||||
saveData(IEntity.STATE_POST_PRE, IEntity.STATE_RUNNING);
|
saveData(IEntity.STATE_POST_PRE, IEntity.STATE_RUNNING);
|
||||||
lastLen = startLocation;
|
lastLen = startLocation;
|
||||||
mListener.onSubStart(entity);
|
mListener.onSubStart(subEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onProgress(long currentLocation) {
|
@Override public void onProgress(long currentLocation) {
|
||||||
long speed = currentLocation - lastLen;
|
long speed = currentLocation - lastLen;
|
||||||
mCurrentLocation += speed;
|
mCurrentLocation += speed;
|
||||||
entity.setCurrentProgress(currentLocation);
|
subEntity.setCurrentProgress(currentLocation);
|
||||||
handleSpeed(speed);
|
handleSpeed(speed);
|
||||||
mListener.onSubRunning(entity);
|
mListener.onSubRunning(subEntity);
|
||||||
if (System.currentTimeMillis() - mLastSaveTime >= RUN_SAVE_INTERVAL) {
|
if (System.currentTimeMillis() - lastSaveTime >= RUN_SAVE_INTERVAL) {
|
||||||
saveData(IEntity.STATE_RUNNING, currentLocation);
|
saveData(IEntity.STATE_RUNNING, currentLocation);
|
||||||
mLastSaveTime = System.currentTimeMillis();
|
lastSaveTime = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
lastLen = currentLocation;
|
lastLen = currentLocation;
|
||||||
}
|
}
|
||||||
@@ -470,7 +469,7 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
@Override public void onStop(long stopLocation) {
|
@Override public void onStop(long stopLocation) {
|
||||||
saveData(IEntity.STATE_STOP, stopLocation);
|
saveData(IEntity.STATE_STOP, stopLocation);
|
||||||
handleSpeed(0);
|
handleSpeed(0);
|
||||||
mListener.onSubStop(entity);
|
mListener.onSubStop(subEntity);
|
||||||
synchronized (AbsGroupUtil.class) {
|
synchronized (AbsGroupUtil.class) {
|
||||||
mStopNum++;
|
mStopNum++;
|
||||||
if (mStopNum + mCompleteNum + mInitFailNum + mFailNum >= mGroupSize) {
|
if (mStopNum + mCompleteNum + mInitFailNum + mFailNum >= mGroupSize) {
|
||||||
@@ -483,13 +482,13 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
@Override public void onCancel() {
|
@Override public void onCancel() {
|
||||||
saveData(IEntity.STATE_CANCEL, -1);
|
saveData(IEntity.STATE_CANCEL, -1);
|
||||||
handleSpeed(0);
|
handleSpeed(0);
|
||||||
mListener.onSubCancel(entity);
|
mListener.onSubCancel(subEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onComplete() {
|
@Override public void onComplete() {
|
||||||
saveData(IEntity.STATE_COMPLETE, entity.getFileSize());
|
saveData(IEntity.STATE_COMPLETE, subEntity.getFileSize());
|
||||||
handleSpeed(0);
|
handleSpeed(0);
|
||||||
mListener.onSubComplete(entity);
|
mListener.onSubComplete(subEntity);
|
||||||
synchronized (AbsGroupUtil.class) {
|
synchronized (AbsGroupUtil.class) {
|
||||||
mCompleteNum++;
|
mCompleteNum++;
|
||||||
//如果子任务完成的数量和总任务数一致,表示任务组任务已经完成
|
//如果子任务完成的数量和总任务数一致,表示任务组任务已经完成
|
||||||
@@ -505,7 +504,7 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onFail(boolean needRetry) {
|
@Override public void onFail(boolean needRetry) {
|
||||||
entity.setFailNum(entity.getFailNum() + 1);
|
subEntity.setFailNum(subEntity.getFailNum() + 1);
|
||||||
saveData(IEntity.STATE_FAIL, lastLen);
|
saveData(IEntity.STATE_FAIL, lastLen);
|
||||||
handleSpeed(0);
|
handleSpeed(0);
|
||||||
reTry(needRetry);
|
reTry(needRetry);
|
||||||
@@ -516,12 +515,12 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
*/
|
*/
|
||||||
private void reTry(boolean needRetry) {
|
private void reTry(boolean needRetry) {
|
||||||
synchronized (AriaManager.LOCK) {
|
synchronized (AriaManager.LOCK) {
|
||||||
if (entity.getFailNum() < 5 && isRunning && needRetry && NetUtils.isConnected(
|
if (subEntity.getFailNum() < 5 && isRunning && needRetry && NetUtils.isConnected(
|
||||||
AriaManager.APP)) {
|
AriaManager.APP)) {
|
||||||
reStartTask();
|
reStartTask();
|
||||||
} else {
|
} else {
|
||||||
mFailNum++;
|
mFailNum++;
|
||||||
mListener.onSubFail(entity);
|
mListener.onSubFail(subEntity);
|
||||||
//如果失败的任务数大于实际的下载任务数,任务组停止下载
|
//如果失败的任务数大于实际的下载任务数,任务组停止下载
|
||||||
if (mFailNum >= mActualTaskNum) {
|
if (mFailNum >= mActualTaskNum) {
|
||||||
closeTimer(false);
|
closeTimer(false);
|
||||||
@@ -535,28 +534,32 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
Timer timer = new Timer();
|
Timer timer = new Timer();
|
||||||
timer.schedule(new TimerTask() {
|
timer.schedule(new TimerTask() {
|
||||||
@Override public void run() {
|
@Override public void run() {
|
||||||
Downloader dt = mDownloaderMap.get(entity.getUrl());
|
Downloader dt = mDownloaderMap.get(subEntity.getUrl());
|
||||||
dt.start();
|
dt.start();
|
||||||
}
|
}
|
||||||
}, 3000);
|
}, 3000);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleSpeed(long speed) {
|
private void handleSpeed(long speed) {
|
||||||
entity.setSpeed(speed);
|
subEntity.setSpeed(speed);
|
||||||
entity.setConvertSpeed(speed <= 0 ? "" : CommonUtil.formatFileSize(speed) + "/s");
|
subEntity.setConvertSpeed(speed <= 0 ? "" : CommonUtil.formatFileSize(speed) + "/s");
|
||||||
entity.setPercent((int) (entity.getCurrentProgress() * 100 / entity.getFileSize()));
|
subEntity.setPercent((int) (subEntity.getCurrentProgress() * 100 / subEntity.getFileSize()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveData(int state, long location) {
|
private void saveData(int state, long location) {
|
||||||
entity.setState(state);
|
subTaskEntity.state = state;
|
||||||
entity.setComplete(state == IEntity.STATE_COMPLETE);
|
subEntity.setState(state);
|
||||||
if (entity.isComplete()) {
|
subEntity.setComplete(state == IEntity.STATE_COMPLETE);
|
||||||
entity.setCompleteTime(System.currentTimeMillis());
|
if (state == IEntity.STATE_CANCEL) {
|
||||||
entity.setCurrentProgress(entity.getFileSize());
|
subTaskEntity.deleteData();
|
||||||
|
return;
|
||||||
|
} else if (subEntity.isComplete()) {
|
||||||
|
subEntity.setCompleteTime(System.currentTimeMillis());
|
||||||
|
subEntity.setCurrentProgress(subEntity.getFileSize());
|
||||||
} else if (location > 0) {
|
} else if (location > 0) {
|
||||||
entity.setCurrentProgress(location);
|
subEntity.setCurrentProgress(location);
|
||||||
}
|
}
|
||||||
entity.update();
|
subTaskEntity.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void supportBreakpoint(boolean support) {
|
@Override public void supportBreakpoint(boolean support) {
|
||||||
|
@@ -118,7 +118,6 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
if (onFileInfoListener != null) {
|
if (onFileInfoListener != null) {
|
||||||
onFileInfoListener.onComplete(mEntity.getUrl(), code);
|
onFileInfoListener.onComplete(mEntity.getUrl(), code);
|
||||||
}
|
}
|
||||||
mEntity.update();
|
|
||||||
mTaskEntity.update();
|
mTaskEntity.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -45,7 +45,7 @@ public abstract class AbsTarget<TARGET extends AbsTarget, ENTITY extends AbsEnti
|
|||||||
* 删除记录
|
* 删除记录
|
||||||
*/
|
*/
|
||||||
public void removeRecord() {
|
public void removeRecord() {
|
||||||
mEntity.deleteData();
|
mTaskEntity.deleteData();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -143,4 +143,18 @@ public abstract class AbsTaskEntity<ENTITY extends AbsEntity> extends DbEntity {
|
|||||||
public int getState() {
|
public int getState() {
|
||||||
return getEntity().getState();
|
return getEntity().getState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override public void deleteData() {
|
||||||
|
if (getEntity() != null) {
|
||||||
|
getEntity().deleteData();
|
||||||
|
}
|
||||||
|
super.deleteData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void update() {
|
||||||
|
if (getEntity() != null) {
|
||||||
|
getEntity().update();
|
||||||
|
}
|
||||||
|
super.update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -40,7 +40,6 @@ public abstract class AbsUploadTarget<TARGET extends AbsUploadTarget, ENTITY ext
|
|||||||
CheckUtil.checkDownloadUrl(uploadUrl);
|
CheckUtil.checkDownloadUrl(uploadUrl);
|
||||||
if (mEntity.getUrl().equals(uploadUrl)) return (TARGET) this;
|
if (mEntity.getUrl().equals(uploadUrl)) return (TARGET) this;
|
||||||
mEntity.setUrl(uploadUrl);
|
mEntity.setUrl(uploadUrl);
|
||||||
//mEntity.setUrl(CommonUtil.convertUrl(uploadUrl));
|
|
||||||
mEntity.update();
|
mEntity.update();
|
||||||
return (TARGET) this;
|
return (TARGET) this;
|
||||||
}
|
}
|
||||||
|
@@ -131,21 +131,17 @@ class BaseUListener<ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskEntity<
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void saveData(int state, long location) {
|
private void saveData(int state, long location) {
|
||||||
mEntity.setComplete(state == IEntity.STATE_COMPLETE);
|
|
||||||
mTaskEntity.state = state;
|
mTaskEntity.state = state;
|
||||||
|
mEntity.setState(state);
|
||||||
|
mEntity.setComplete(state == IEntity.STATE_COMPLETE);
|
||||||
if (state == IEntity.STATE_CANCEL) {
|
if (state == IEntity.STATE_CANCEL) {
|
||||||
mEntity.deleteData();
|
mTaskEntity.deleteData();
|
||||||
} else if (state == IEntity.STATE_COMPLETE) {
|
return;
|
||||||
mEntity.setState(state);
|
} else if (mEntity.isComplete()) {
|
||||||
mEntity.setCompleteTime(System.currentTimeMillis());
|
mEntity.setCompleteTime(System.currentTimeMillis());
|
||||||
mEntity.setCurrentProgress(mEntity.getFileSize());
|
mEntity.setCurrentProgress(mEntity.getFileSize());
|
||||||
mEntity.update();
|
} else if (location > 0) {
|
||||||
} else {
|
mEntity.setCurrentProgress(location);
|
||||||
mEntity.setState(state);
|
|
||||||
if (location != -1) {
|
|
||||||
mEntity.setCurrentProgress(location);
|
|
||||||
}
|
|
||||||
mEntity.update();
|
|
||||||
}
|
}
|
||||||
mTaskEntity.update();
|
mTaskEntity.update();
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@ package com.arialyy.aria.orm;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import com.arialyy.aria.core.ErrorEntity;
|
import com.arialyy.aria.core.ErrorEntity;
|
||||||
|
import com.arialyy.aria.core.UrlMapping;
|
||||||
import com.arialyy.aria.core.download.DownloadEntity;
|
import com.arialyy.aria.core.download.DownloadEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadGroupEntity;
|
import com.arialyy.aria.core.download.DownloadGroupEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
||||||
@@ -33,7 +34,8 @@ import java.util.Map;
|
|||||||
class DBConfig {
|
class DBConfig {
|
||||||
static Map<String, Class> mapping = new HashMap<>();
|
static Map<String, Class> mapping = new HashMap<>();
|
||||||
static String DB_NAME;
|
static String DB_NAME;
|
||||||
static int VERSION = 16;
|
//static int VERSION = 16;
|
||||||
|
static int VERSION = 17;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
if (TextUtils.isEmpty(DB_NAME)) {
|
if (TextUtils.isEmpty(DB_NAME)) {
|
||||||
@@ -52,5 +54,6 @@ class DBConfig {
|
|||||||
mapping.put("UploadEntity", UploadEntity.class);
|
mapping.put("UploadEntity", UploadEntity.class);
|
||||||
mapping.put("UploadTaskEntity", UploadTaskEntity.class);
|
mapping.put("UploadTaskEntity", UploadTaskEntity.class);
|
||||||
mapping.put("ErrorEntity", ErrorEntity.class);
|
mapping.put("ErrorEntity", ErrorEntity.class);
|
||||||
|
//mapping.put("UrlMapping", UrlMapping.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
30
Aria/src/main/java/com/arialyy/aria/orm/NoNull.java
Normal file
30
Aria/src/main/java/com/arialyy/aria/orm/NoNull.java
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* 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.orm;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by lyy on 2015/11/2.
|
||||||
|
* 非空字段
|
||||||
|
*/
|
||||||
|
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface NoNull {
|
||||||
|
boolean value() default true;
|
||||||
|
}
|
@@ -26,7 +26,6 @@ import android.util.Log;
|
|||||||
import com.arialyy.aria.core.AriaManager;
|
import com.arialyy.aria.core.AriaManager;
|
||||||
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 java.io.IOException;
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -423,6 +422,8 @@ final class SqlHelper extends SQLiteOpenHelper {
|
|||||||
db = checkDb(db);
|
db = checkDb(db);
|
||||||
List<Field> fields = CommonUtil.getAllFields(clazz);
|
List<Field> fields = CommonUtil.getAllFields(clazz);
|
||||||
if (fields != null && fields.size() > 0) {
|
if (fields != null && fields.size() > 0) {
|
||||||
|
//外键Map,在Sqlite3中foreign修饰的字段必须放在最后
|
||||||
|
final List<Field> foreignArray = new ArrayList<>();
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append("create table ")
|
sb.append("create table ")
|
||||||
.append(TextUtils.isEmpty(tableName) ? CommonUtil.getClassName(clazz) : tableName)
|
.append(TextUtils.isEmpty(tableName) ? CommonUtil.getClassName(clazz) : tableName)
|
||||||
@@ -458,17 +459,26 @@ final class SqlHelper extends SQLiteOpenHelper {
|
|||||||
sb.append(" PRIMARY KEY");
|
sb.append(" PRIMARY KEY");
|
||||||
}
|
}
|
||||||
if (SqlUtil.isForeign(field)) {
|
if (SqlUtil.isForeign(field)) {
|
||||||
Foreign foreign = field.getAnnotation(Foreign.class);
|
foreignArray.add(field);
|
||||||
sb.append(",FOREIGN KEY (")
|
}
|
||||||
.append(field.getName())
|
|
||||||
.append(") REFERENCES ")
|
if (SqlUtil.isNoNull(field)) {
|
||||||
.append(foreign.table())
|
sb.append(" NOT NULL");
|
||||||
.append("(")
|
|
||||||
.append(foreign.column())
|
|
||||||
.append(")");
|
|
||||||
}
|
}
|
||||||
sb.append(",");
|
sb.append(",");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (Field field : foreignArray) {
|
||||||
|
Foreign foreign = field.getAnnotation(Foreign.class);
|
||||||
|
sb.append("FOREIGN KEY (")
|
||||||
|
.append(field.getName())
|
||||||
|
.append(") REFERENCES ")
|
||||||
|
.append(CommonUtil.getClassName(foreign.table()))
|
||||||
|
.append("(")
|
||||||
|
.append(foreign.column())
|
||||||
|
.append("),");
|
||||||
|
}
|
||||||
|
|
||||||
String str = sb.toString();
|
String str = sb.toString();
|
||||||
str = str.substring(0, str.length() - 1) + ");";
|
str = str.substring(0, str.length() - 1) + ");";
|
||||||
print(CREATE_TABLE, str);
|
print(CREATE_TABLE, str);
|
||||||
|
@@ -184,13 +184,13 @@ final class SqlUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断是否是主外键约束
|
* 判断是否是非空约束
|
||||||
*
|
*
|
||||||
* @return {@code true}主外键约束
|
* @return {@code true}为非空约束
|
||||||
*/
|
*/
|
||||||
static boolean isPrimaryAndForeign(Field field) {
|
static boolean isNoNull(Field field) {
|
||||||
PrimaryAndForeign fk = field.getAnnotation(PrimaryAndForeign.class);
|
NoNull nn = field.getAnnotation(NoNull.class);
|
||||||
return fk != null;
|
return nn != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Object checkData(String type, String data) {
|
private static Object checkData(String type, String data) {
|
||||||
|
@@ -247,9 +247,6 @@ public class CommonUtil {
|
|||||||
dir.delete();
|
dir.delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (entity != null) {
|
|
||||||
entity.deleteData();
|
|
||||||
}
|
|
||||||
tEntity.deleteData();
|
tEntity.deleteData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,7 +268,7 @@ public class CommonUtil {
|
|||||||
if (config.exists()) {
|
if (config.exists()) {
|
||||||
config.delete();
|
config.delete();
|
||||||
}
|
}
|
||||||
uEntity.deleteData();
|
//uEntity.deleteData();
|
||||||
tEntity.deleteData();
|
tEntity.deleteData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,6 +29,7 @@ public class UploadTaskEntity extends AbsNormalTaskEntity<UploadEntity> {
|
|||||||
public String contentType = "multipart/form-data"; //上传的文件类型
|
public String contentType = "multipart/form-data"; //上传的文件类型
|
||||||
public String userAgent = "User-Agent";
|
public String userAgent = "User-Agent";
|
||||||
@OneToOne(table = UploadEntity.class, key = "filePath") public UploadEntity entity;
|
@OneToOne(table = UploadEntity.class, key = "filePath") public UploadEntity entity;
|
||||||
|
public String filePath = "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 文件上传表单
|
* 文件上传表单
|
||||||
@@ -41,4 +42,12 @@ public class UploadTaskEntity extends AbsNormalTaskEntity<UploadEntity> {
|
|||||||
@Override public UploadEntity getEntity() {
|
@Override public UploadEntity getEntity() {
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void save(UploadEntity entity) {
|
||||||
|
filePath = entity.getFilePath();
|
||||||
|
key = entity.getKey();
|
||||||
|
this.entity = entity;
|
||||||
|
entity.save();
|
||||||
|
save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user