From b7b55e42fc724ce984b50dffab250f45592dad62 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 15 Aug 2017 10:41:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=B7=E6=96=B0=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E4=BF=A1=E6=81=AF=E7=9A=84api=20https://github.com/Ar?= =?UTF-8?q?iaLyy/Aria/issues/89#issuecomment-322193785?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aria/core/download/DownloadReceiver.java | 44 ++++++++++++++++--- .../aria/core/download/DownloadTarget.java | 10 +++++ .../aria/core/download/FtpDownloadTarget.java | 5 +++ .../download/downloader/AbsFtpInfoThread.java | 4 +- .../core/download/downloader/Downloader.java | 15 ++++--- .../download/downloader/FtpDirInfoThread.java | 2 - .../downloader/FtpFileInfoThread.java | 8 ++++ .../downloader/HttpFileInfoThread.java | 8 ++-- .../downloader/SimpleDownloadUtil.java | 4 +- .../arialyy/aria/core/inf/AbsTaskEntity.java | 10 +++++ app/src/main/assets/aria_config.xml | 5 ++- .../simple/download/FtpDownloadActivity.java | 2 +- .../simple/download/SingleTaskActivity.java | 2 +- .../group/FTPDirDownloadActivity.java | 2 +- .../com/arialyy/aria/core/Configuration.java | 2 +- 15 files changed, 96 insertions(+), 27 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java index 90088d3f..886fcb68 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java @@ -16,16 +16,14 @@ package com.arialyy.aria.core.download; import android.support.annotation.NonNull; -import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.AriaManager; +import com.arialyy.aria.core.command.normal.NormalCmdFactory; +import com.arialyy.aria.core.common.ProxyHelper; import com.arialyy.aria.core.inf.AbsEntity; import com.arialyy.aria.core.inf.AbsReceiver; -import com.arialyy.aria.core.inf.IReceiver; -import com.arialyy.aria.core.command.normal.NormalCmdFactory; import com.arialyy.aria.core.scheduler.DownloadGroupSchedulers; import com.arialyy.aria.core.scheduler.DownloadSchedulers; import com.arialyy.aria.core.scheduler.ISchedulerListener; -import com.arialyy.aria.core.common.ProxyHelper; import com.arialyy.aria.orm.DbEntity; import com.arialyy.aria.util.CheckUtil; import com.arialyy.aria.util.CommonUtil; @@ -53,17 +51,40 @@ public class DownloadReceiver extends AbsReceiver { /** * 使用下载实体执行下载操作 + * + * @param entity 下载实体 */ public DownloadTarget load(DownloadEntity entity) { - return new DownloadTarget(entity, targetName); + return load(entity, false); + } + + /** + * 使用下载实体执行下载操作 + * + * @param refreshInfo 是否刷新下载信息 + */ + public DownloadTarget load(DownloadEntity entity, boolean refreshInfo) { + return new DownloadTarget(entity, targetName, refreshInfo); } /** * 加载Http、https单任务下载地址 + * + * @param url 下载地址 */ public DownloadTarget load(@NonNull String url) { + return load(url, false); + } + + /** + * 加载Http、https单任务下载地址 + * + * @param url 下载地址 + * @param refreshInfo 是否刷新下载信息 + */ + public DownloadTarget load(@NonNull String url, boolean refreshInfo) { CheckUtil.checkDownloadUrl(url); - return new DownloadTarget(url, targetName); + return new DownloadTarget(url, targetName, refreshInfo); } /** @@ -78,8 +99,17 @@ public class DownloadReceiver extends AbsReceiver { * 加载ftp单任务下载地址 */ public FtpDownloadTarget loadFtp(@NonNull String url) { + return loadFtp(url, false); + } + + /** + * 加载ftp单任务下载地址 + * + * @param refreshInfo 是否刷新下载信息 + */ + public FtpDownloadTarget loadFtp(@NonNull String url, boolean refreshInfo) { CheckUtil.checkDownloadUrl(url); - return new FtpDownloadTarget(url, targetName); + return new FtpDownloadTarget(url, targetName, refreshInfo); } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java index 6303a43b..1c527810 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java @@ -33,16 +33,26 @@ public class DownloadTarget protected String url; DownloadTarget(DownloadEntity entity, String targetName) { + this(entity, targetName, false); + } + + DownloadTarget(DownloadEntity entity, String targetName, boolean refreshInfo) { this.url = entity.getUrl(); mTargetName = targetName; initTask(entity); + mTaskEntity.refreshInfo = refreshInfo; } DownloadTarget(String url, String targetName) { + this(url, targetName, false); + } + + DownloadTarget(String url, String targetName, boolean refreshInfo) { this.url = url; mTargetName = targetName; DownloadEntity entity = getEntity(url); initTask(entity); + mTaskEntity.refreshInfo = refreshInfo; } private void initTask(DownloadEntity entity) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java index b7dea7cc..210528d5 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java @@ -32,6 +32,10 @@ public class FtpDownloadTarget extends DownloadTarget { private int port; FtpDownloadTarget(String url, String targetName) { + this(url, targetName, false); + } + + FtpDownloadTarget(String url, String targetName, boolean refreshInfo) { super(url, targetName); String[] pp = url.split("/")[2].split(":"); this.serverIp = pp[0]; @@ -45,6 +49,7 @@ public class FtpDownloadTarget extends DownloadTarget { mTaskEntity.serverIp = serverIp; mTaskEntity.port = port; mEntity.setFileName(url.substring(lastIndex + 1, url.length())); + mTaskEntity.refreshInfo = refreshInfo; } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsFtpInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsFtpInfoThread.java index b20909c7..20e9a834 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsFtpInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsFtpInfoThread.java @@ -40,6 +40,7 @@ abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY extends Ab protected TASK_ENTITY mTaskEntity; private int mConnectTimeOut; private OnFileInfoCallback mCallback; + protected long mSize = 0; AbsFtpInfoThread(TASK_ENTITY taskEntity, OnFileInfoCallback callback) { mTaskEntity = taskEntity; @@ -82,8 +83,7 @@ abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY extends Ab client.setFileType(FTP.BINARY_FILE_TYPE); FTPFile[] files = client.listFiles(new String(remotePath.getBytes(charSet), AbsThreadTask.SERVER_CHARSET)); - long size = getFileSize(files, client, remotePath); - mEntity.setFileSize(size); + mSize = getFileSize(files, client, remotePath); reply = client.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { client.disconnect(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java index ddfb8c4f..241b324b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java @@ -40,22 +40,25 @@ class Downloader extends AbsFileer<DownloadEntity, DownloadTaskEntity> { } @Override protected void checkTask() { - if (!mTaskEntity.isSupportBP) { - isNewTask = true; - return; - } mConfigFile = new File(mContext.getFilesDir().getPath() + AriaManager.DOWNLOAD_TEMP_DIR + mEntity.getFileName() + ".properties"); mTempFile = new File(mEntity.getDownloadPath()); + if (!mTaskEntity.isSupportBP) { + isNewTask = true; + return; + } + if (mTaskEntity.isNewTask) { + isNewTask = true; + return; + } if (!mConfigFile.exists()) { //记录文件被删除,则重新下载 isNewTask = true; CommonUtil.createFile(mConfigFile.getPath()); } else if (!mTempFile.exists()) { isNewTask = true; - } else if (DbEntity.findFirst(DownloadEntity.class, "url=?", mEntity.getDownloadUrl()) - == null) { + } else if (DbEntity.findFirst(DownloadEntity.class, "url=?", mEntity.getUrl()) == null) { isNewTask = true; } else { isNewTask = checkConfigFile(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java index 963639de..d53c186d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java @@ -28,7 +28,6 @@ import org.apache.commons.net.ftp.FTPFile; * 获取ftp文件夹信息 */ class FtpDirInfoThread extends AbsFtpInfoThread<DownloadGroupEntity, DownloadGroupTaskEntity> { - private long mSize = 0; FtpDirInfoThread(DownloadGroupTaskEntity taskEntity, OnFileInfoCallback callback) { super(taskEntity, callback); @@ -36,7 +35,6 @@ class FtpDirInfoThread extends AbsFtpInfoThread<DownloadGroupEntity, DownloadGro @Override void handleFile(String remotePath, FTPFile ftpFile) { super.handleFile(remotePath, ftpFile); - mSize += ftpFile.getSize(); addEntity(remotePath, ftpFile); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java index c83db279..82991c77 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java @@ -27,4 +27,12 @@ class FtpFileInfoThread extends AbsFtpInfoThread<DownloadEntity, DownloadTaskEnt FtpFileInfoThread(DownloadTaskEntity taskEntity, OnFileInfoCallback callback) { super(taskEntity, callback); } + + @Override protected void onPreComplete() { + super.onPreComplete(); + if (mSize != mTaskEntity.getEntity().getFileSize()) { + mTaskEntity.isNewTask = true; + } + mEntity.setFileSize(mSize); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java index 07103531..83d3c2d3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java @@ -25,7 +25,6 @@ import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLDecoder; -import java.net.URLEncoder; /** * 下载文件信息获取 @@ -147,12 +146,15 @@ class HttpFileInfoThread implements Runnable { } /** - * 检查长度是否合法 + * 检查长度是否合法,并且检查新获取的文件长度是否和数据库的文件长度一直,如果不一致,则表示该任务为新任务 * * @param len 从服务器获取的文件长度 - * @return true, 合法 + * @return {@code true}合法 */ private boolean checkLen(long len) { + if (len != mEntity.getFileSize()) { + mTaskEntity.isNewTask = true; + } if (len < 0) { failDownload("任务【" + mEntity.getUrl() + "】下载失败,文件长度小于0"); return false; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java index 62236c33..a124bb27 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java @@ -23,7 +23,7 @@ import com.arialyy.aria.core.inf.IDownloadListener; /** * Created by lyy on 2015/8/25. - * HTTP单任务下载工具 + * HTTP\FTP单任务下载工具 */ public class SimpleDownloadUtil implements IUtil, Runnable { private static final String TAG = "SimpleDownloadUtil"; @@ -87,7 +87,7 @@ public class SimpleDownloadUtil implements IUtil, Runnable { @Override public void run() { mListener.onPre(); - if (mTaskEntity.getEntity().getFileSize() <= 1) { + if (mTaskEntity.getEntity().getFileSize() <= 1 || mTaskEntity.refreshInfo) { new Thread(createInfoThread()).start(); } else { mDownloader.start(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java index 02048aa7..0afb9a4e 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTaskEntity.java @@ -50,6 +50,16 @@ public abstract class AbsTaskEntity<ENTITY extends AbsEntity> extends DbEntity { @Ignore public String userName, userPw, account, serverIp; @Ignore public int port; + /** + * 刷新信息 {@code true} 重新刷新下载信息 + */ + @Ignore public boolean refreshInfo = false; + + /** + * 是否是新任务,{@code true} 新任务 + */ + @Ignore public boolean isNewTask = false; + /** * 请求类型 * {@link AbsTaskEntity#HTTP}、{@link AbsTaskEntity#FTP} diff --git a/app/src/main/assets/aria_config.xml b/app/src/main/assets/aria_config.xml index 621b0464..b2d0febd 100644 --- a/app/src/main/assets/aria_config.xml +++ b/app/src/main/assets/aria_config.xml @@ -31,7 +31,7 @@ <!--是否需要转换速度单位,转换完成后为:1b/s、1kb/s、1mb/s、1gb/s、1tb/s,如果不需要将返回byte长度--> <convertSpeed value="true"/> - <!--执行队列类型,见com.arialyy.aria.core.QueueMod,默认类型为now--> + <!--执行队列类型,见com.arialyy.aria.core.QueueMod,默认类型为wait--> <queueMod value="wait"/> </download> @@ -51,6 +51,9 @@ <!--设置url连接超时时间,单位为毫秒,默认5000毫秒--> <connectTimeOut value="5000"/> + + <!--执行队列类型,见com.arialyy.aria.core.QueueMod,默认类型为wait--> + <queueMod value="wait"/> </upload> </aria> \ No newline at end of file diff --git a/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java b/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java index a1bf4f89..a871366e 100644 --- a/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/FtpDownloadActivity.java @@ -59,7 +59,7 @@ public class FtpDownloadActivity extends BaseActivity<ActivityFtpDownloadBinding switch (view.getId()) { case R.id.start: Aria.download(this) - .loadFtp(URL) + .loadFtp(URL, true) .login("lao", "123456") .setDownloadPath("/mnt/sdcard/") .start(); diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 381d3967..c96d01cc 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -187,7 +187,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> { switch (view.getId()) { case R.id.start: Aria.download(SingleTaskActivity.this) - .load(DOWNLOAD_URL) + .load(DOWNLOAD_URL, true) .addHeader("groupName", "value") .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/gggg.apk") .start(); diff --git a/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java b/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java index f9b0000f..864adc59 100644 --- a/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/group/FTPDirDownloadActivity.java @@ -35,7 +35,7 @@ import com.arialyy.simple.widget.SubStateLinearLayout; * Created by Aria.Lao on 2017/7/6. */ public class FTPDirDownloadActivity extends BaseActivity<ActivityDownloadGroupBinding> { - private static final String dir = "ftp://172.18.104.129:21/haha/"; + private static final String dir = "ftp://172.18.104.66:21/haha/"; @Bind(R.id.child_list) SubStateLinearLayout mChildList; diff --git a/aria/src/main/java/com/arialyy/aria/core/Configuration.java b/aria/src/main/java/com/arialyy/aria/core/Configuration.java index e8b6ba7a..e65f4218 100644 --- a/aria/src/main/java/com/arialyy/aria/core/Configuration.java +++ b/aria/src/main/java/com/arialyy/aria/core/Configuration.java @@ -70,7 +70,7 @@ class Configuration { * * @see QueueMod */ - String queueMod = "now"; + String queueMod = "wait"; public String getQueueMod() { return queueMod;