修复单线程下载时,文件已经完成,重复下载回调下载失败的问题
修复一个重新下载文件时,同名路径文件没有被被删除的问题
This commit is contained in:
@@ -1,4 +1,7 @@
|
|||||||
## 开发日志
|
## 开发日志
|
||||||
|
+ v_3.8.16
|
||||||
|
- 修复单线程下载时,文件已经完成,重复下载回调下载失败的问题
|
||||||
|
- 修复一个重新下载文件时,同名路径文件没有被被删除的问题
|
||||||
+ v_3.8.15 (2020/11/9)
|
+ v_3.8.15 (2020/11/9)
|
||||||
- 修复不支持断点的连接下载失败问题,https://github.com/AriaLyy/Aria/issues/771
|
- 修复不支持断点的连接下载失败问题,https://github.com/AriaLyy/Aria/issues/771
|
||||||
- 修复iv不存在时,索引文件异常的问题,https://github.com/AriaLyy/Aria/issues/780
|
- 修复iv不存在时,索引文件异常的问题,https://github.com/AriaLyy/Aria/issues/780
|
||||||
|
|||||||
@@ -35,10 +35,13 @@ final class HttpDTTBuilderAdapter extends AbsNormalTTBuilderAdapter {
|
|||||||
BufferedRandomAccessFile file = null;
|
BufferedRandomAccessFile file = null;
|
||||||
try {
|
try {
|
||||||
if (totalThreadNum > 1 && !record.isBlock) {
|
if (totalThreadNum > 1 && !record.isBlock) {
|
||||||
file = new BufferedRandomAccessFile(new File(getTempFile().getPath()), "rwd", 8192);
|
file = new BufferedRandomAccessFile(getTempFile().getPath(), "rwd", 8192);
|
||||||
//设置文件长度
|
//设置文件长度
|
||||||
file.setLength(getEntity().getFileSize());
|
file.setLength(getEntity().getFileSize());
|
||||||
}
|
}
|
||||||
|
if (getTempFile().exists()) {
|
||||||
|
FileUtil.deleteFile(getTempFile());
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ public class RecordHelper {
|
|||||||
tr.endLocation = endL;
|
tr.endLocation = endL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mWrapper.setNewTask(false);
|
//mWrapper.setNewTask(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -125,8 +125,8 @@ public class RecordHelper {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
long realLocation =
|
//正常情况下,该线程的startLocation的位置
|
||||||
tr.threadId * normalRectLen + blockFileLen; //正常情况下,该线程的startLocation的位置
|
long realLocation = tr.threadId * normalRectLen + blockFileLen;
|
||||||
/*
|
/*
|
||||||
* 检查记录文件
|
* 检查记录文件
|
||||||
*/
|
*/
|
||||||
@@ -147,7 +147,7 @@ public class RecordHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mWrapper.setNewTask(false);
|
//mWrapper.setNewTask(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -190,7 +190,7 @@ public class RecordHelper {
|
|||||||
tr.isComplete = false;
|
tr.isComplete = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mWrapper.setNewTask(false);
|
//mWrapper.setNewTask(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -105,16 +105,16 @@ public class NormalThreadStateManager implements IThreadStateManager {
|
|||||||
// mergerSFtp();
|
// mergerSFtp();
|
||||||
// mListener.onComplete();
|
// mListener.onComplete();
|
||||||
//} else
|
//} else
|
||||||
|
if (mTaskRecord.isBlock || mTaskRecord.threadNum == 1) {
|
||||||
if (mTaskRecord.isBlock) {
|
|
||||||
if (mergeFile()) {
|
if (mergeFile()) {
|
||||||
mListener.onComplete();
|
mListener.onComplete();
|
||||||
} else {
|
} else {
|
||||||
mListener.onFail(false, null);
|
mListener.onFail(false, null);
|
||||||
}
|
}
|
||||||
} else {
|
quitLooper();
|
||||||
mListener.onComplete();
|
break;
|
||||||
}
|
}
|
||||||
|
mListener.onComplete();
|
||||||
quitLooper();
|
quitLooper();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -248,8 +248,13 @@ public class NormalThreadStateManager implements IThreadStateManager {
|
|||||||
*/
|
*/
|
||||||
private boolean mergeFile() {
|
private boolean mergeFile() {
|
||||||
if (mTaskRecord.threadNum == 1) {
|
if (mTaskRecord.threadNum == 1) {
|
||||||
|
File targetFile = new File(mTaskRecord.filePath);
|
||||||
|
if (targetFile.exists() && targetFile.length() == mTaskRecord.fileLength){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
FileUtil.deleteFile(targetFile);
|
||||||
File partFile = new File(String.format(IRecordHandler.SUB_PATH, mTaskRecord.filePath, 0));
|
File partFile = new File(String.format(IRecordHandler.SUB_PATH, mTaskRecord.filePath, 0));
|
||||||
return partFile.renameTo(new File(mTaskRecord.filePath));
|
return partFile.renameTo(targetFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> partPath = new ArrayList<>();
|
List<String> partPath = new ArrayList<>();
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public synchronized void updateCompleteState() {
|
@Override public synchronized void updateCompleteState() {
|
||||||
ALog.i(TAG, String.format("任务【%s】线程__%s__完成", getTaskWrapper().getKey(), mRecord.threadId));
|
ALog.i(TAG, String.format("任务【%s】线程__%s__完成, blockSize = %s", getTaskWrapper().getKey(), mRecord.threadId, mConfig.tempFile.length()));
|
||||||
writeConfig(true, mRecord.endLocation);
|
writeConfig(true, mRecord.endLocation);
|
||||||
// 进度发送不是实时的,发送完成任务前,需要更新一次进度
|
// 进度发送不是实时的,发送完成任务前,需要更新一次进度
|
||||||
sendRunningState();
|
sendRunningState();
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import android.os.StatFs;
|
|||||||
import android.os.storage.StorageManager;
|
import android.os.storage.StorageManager;
|
||||||
import android.os.storage.StorageVolume;
|
import android.os.storage.StorageVolume;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
import com.arialyy.aria.core.AriaConfig;
|
import com.arialyy.aria.core.AriaConfig;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -322,6 +323,7 @@ public class FileUtil {
|
|||||||
* @return {@code true} 合并成功,{@code false}合并失败
|
* @return {@code true} 合并成功,{@code false}合并失败
|
||||||
*/
|
*/
|
||||||
public static boolean mergeFile(String targetPath, List<String> subPaths) {
|
public static boolean mergeFile(String targetPath, List<String> subPaths) {
|
||||||
|
Log.d(TAG, "开始合并文件");
|
||||||
File file = new File(targetPath);
|
File file = new File(targetPath);
|
||||||
FileOutputStream fos = null;
|
FileOutputStream fos = null;
|
||||||
FileChannel foc = null;
|
FileChannel foc = null;
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
3、从3.4.1开始,如果线程数为1,文件初始化时将不再预占用对应长度的空间,下载多少byte,则占多大的空间;
|
3、从3.4.1开始,如果线程数为1,文件初始化时将不再预占用对应长度的空间,下载多少byte,则占多大的空间;
|
||||||
对于采用多线程的任务或旧任务,依然采用原来的文件空间占用方式;
|
对于采用多线程的任务或旧任务,依然采用原来的文件空间占用方式;
|
||||||
-->
|
-->
|
||||||
<threadNum value="3"/>
|
<threadNum value="1"/>
|
||||||
|
|
||||||
<!--设置下载队列最大任务数, 默认为2-->
|
<!--设置下载队列最大任务数, 默认为2-->
|
||||||
<maxTaskNum value="1"/>
|
<maxTaskNum value="1"/>
|
||||||
|
|||||||
@@ -51,10 +51,11 @@ public class HttpDownloadModule extends BaseViewModule {
|
|||||||
//String url = AppUtil.getConfigValue(context, HTTP_URL_KEY, defUrl);
|
//String url = AppUtil.getConfigValue(context, HTTP_URL_KEY, defUrl);
|
||||||
//String url = "http://fdfs.speedata.cn:9989/group1/M00/00/05/rBGFrl3fdAKAVJwfMtSa9R18wLU139.zip";
|
//String url = "http://fdfs.speedata.cn:9989/group1/M00/00/05/rBGFrl3fdAKAVJwfMtSa9R18wLU139.zip";
|
||||||
//String url = "http://9.9.9.28:8088/files/update.zip";
|
//String url = "http://9.9.9.28:8088/files/update.zip";
|
||||||
//String url = "https://y.qq.com/download/import/QQMusic-import-1.2.1.zip";
|
String url = "https://y.qq.com/download/import/QQMusic-import-1.2.1.zip";
|
||||||
String url = "https://gitee.com/huang-junhua/iptv/raw/master/guonei.m3u8";
|
//String url = "https://gitee.com/huang-junhua/iptv/raw/master/guonei.m3u8";
|
||||||
|
//String url = "http://v.kjjl100.com/kz/zx/cj/2020cjswxdb/1.mp4";
|
||||||
//String url = "https://static.runoob.com/images/demo/demo2.jpg";
|
//String url = "https://static.runoob.com/images/demo/demo2.jpg";
|
||||||
String filePath = "/mnt/sdcard/xxx.m3u8";
|
String filePath = "/mnt/sdcard/qq.zip";
|
||||||
|
|
||||||
singDownloadInfo = Aria.download(context).getFirstDownloadEntity(url);
|
singDownloadInfo = Aria.download(context).getFirstDownloadEntity(url);
|
||||||
if (singDownloadInfo == null) {
|
if (singDownloadInfo == null) {
|
||||||
|
|||||||
@@ -266,7 +266,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
if (task.getKey().equals(mUrl)) {
|
if (task.getKey().equals(mUrl)) {
|
||||||
Toast.makeText(SingleTaskActivity.this, getString(R.string.download_success),
|
Toast.makeText(SingleTaskActivity.this, getString(R.string.download_success),
|
||||||
Toast.LENGTH_SHORT).show();
|
Toast.LENGTH_SHORT).show();
|
||||||
//ALog.d(TAG, "文件md5: 9886e90f014d462b560dcec9c327bdb7");
|
ALog.d(TAG, "文件md5: e088677570afe2e9f847cc8159b932dd");
|
||||||
ALog.d(TAG, "下载完成的文件md5: " + CommonUtil.getFileMD5(new File(task.getFilePath())));
|
ALog.d(TAG, "下载完成的文件md5: " + CommonUtil.getFileMD5(new File(task.getFilePath())));
|
||||||
getBinding().pl.setInfo(task.getEntity());
|
getBinding().pl.setInfo(task.getEntity());
|
||||||
getBinding().pl.setProgress(100);
|
getBinding().pl.setProgress(100);
|
||||||
|
|||||||
Reference in New Issue
Block a user