lingochamp / okdownload

A Reliable, Flexible, Fast and Powerful download engine.
Apache License 2.0
5.13k stars 767 forks source link

下载超过2G多大文件时,杀进程后,再次下载无法断点续传。 #491

Open weiwdev opened 1 year ago

weiwdev commented 1 year ago

OkDownload Version

v1.0.7

Problem Describe

使用OKdownload下载一个大文件(如2.4G,超出int范围,为long型), 下载一部分后,退出app,并杀掉该进程;重新进入app下载,此时下载进度从0开始。 小文件下载,断点续传正常,没有该问题。

Cause

第二次重新进入app下载时,新建BreakpointStoreOnSQLite时,会判断BlockInfoRow的startOffset, contentLength, currentOffset等字段,如果小于0,则抛出异常,无法使用SQLite里的断点信息。 大文件下载时,contentLength字段会被写入long型的数据(超出int范围),第二次下载读取BlockInfoRow的contentLength时,仍然是按int型读取,导致读取到负值,加载BreakpointStoreOnSQLite、断点信息失败。

相关代码如下:startOffset、contentLength、currentOffset是long型,确按int读取。 public class BlockInfoRow { private final int breakpointId;

private final long startOffset;
private final long contentLength;
private final long currentOffset;

public BlockInfoRow(Cursor cursor) {
    this.breakpointId = cursor.getInt(cursor.getColumnIndex(HOST_ID));
    this.startOffset = cursor.getInt(cursor.getColumnIndex(START_OFFSET));
    this.contentLength = cursor.getInt(cursor.getColumnIndex(CONTENT_LENGTH));
    this.currentOffset = cursor.getInt(cursor.getColumnIndex(CURRENT_OFFSET));
}

Log

在okdownload-breakpoint-sqlite增加部分调试log,打印如下: --------- beginning of main --------- beginning of system 10-11 17:41:28.911 3160 3160 E debug : ##return BreakpointStoreOnSQLite## 10-11 17:41:29.745 3332 3332 E debug : ##return BreakpointStoreOnSQLite## 10-11 17:41:29.989 3238 3238 E debug : ##return BreakpointStoreOnSQLite## 10-11 17:41:31.607 3613 3613 E debug : ##return BreakpointStoreOnSQLite## 10-11 17:41:37.620 3160 3877 E debug : ##get BreakpointInfo,task:1 10-11 17:41:37.627 3160 3877 E debug : ##get BreakpointInfo,task:1 10-11 17:41:37.627 3160 3877 E debug : ##get BreakpointInfo,task:1 10-11 17:41:37.628 3160 3881 E debug : ##get BreakpointInfo,task:1 10-11 17:41:39.130 3160 3287 E debug : ##get BreakpointInfo,task:1 10-11 17:41:39.134 3160 3287 E debug : insert blockCount success:1current_offset=4096 start_offset=0 content_length=2568924379 breakpoint_id=1 block_index=0 10-11 17:41:39.957 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:756868 10-11 17:41:41.985 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:1794048 10-11 17:41:44.004 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:1773568 10-11 17:41:44.889 3160 3160 E debug : ##get BreakpointInfo,task:1 10-11 17:41:46.035 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:2158592 10-11 17:41:48.073 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:2568192 10-11 17:41:50.117 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:2977792 10-11 17:41:52.166 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:3387392 10-11 17:41:53.477 3160 3160 E debug : ##get BreakpointInfo,task:1 10-11 17:41:54.196 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:3795208 10-11 17:41:56.241 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:3899392 10-11 17:41:57.049 3160 3160 E debug : ##get BreakpointInfo,task:1 10-11 17:41:57.077 3160 3887 E debug : BreakpointStoreOnSQLite onSyncToFilesystemSuccess, blockIndex:0, increaseLength:1949696

杀进程后,重新启动下载: 10-11 17:42:07.654 4868 4868 E debug : ##return BreakpointStoreOnSQLite## 10-11 17:42:07.657 4868 4868 E debug : ###BlockInfoRow startOffset, contentLength, currentOffset###0,-1726042917,25064844 10-11 17:42:07.659 4868 4868 E debug : ##create BreakpointStoreOnSQLite fail InvocationTargetException##java.lang.reflect.InvocationTargetException 10-11 17:42:07.659 4868 4868 E debug : ##return BreakpointStoreOnCache## 10-11 17:42:08.380 5007 5007 E debug : ##return BreakpointStoreOnSQLite## 10-11 17:42:08.390 5007 5007 E debug : ###BlockInfoRow startOffset, contentLength, currentOffset###0,-1726042917,25064844 10-11 17:42:08.392 5007 5007 E debug : ##create BreakpointStoreOnSQLite fail InvocationTargetException##java.lang.reflect.InvocationTargetException 10-11 17:42:08.392 5007 5007 E debug : ##return BreakpointStoreOnCache##

tianshaokai commented 1 year ago

@weiwdev 可以发一下下载文件链接吗

wjzabc commented 1 year ago

遇到同样的大文件杀进程无法续传问题