近日,公司修改下载方式为FTP地址直接下载,在修改完成下载方式后,自测过程中,发现一个问题!!!
在使用androidX以下版本下载时(targetSdkVersion < 29),可以正常下载并进行后续工作,但是在使用androidX版本的时候(targetSdkVersion >= 29),下载功能必然失败!
错误信息:The current offset on block-info isn’t update correct, 2920 != 10006923 on 1
目前猜测原因:Android 10 修改了SparseArray,在Android 9 和之前的版本,传入的下标越界不做处理,现在会抛异常了!!!
深度原因正在查找,先贴出解决办法,如下:
1、 在项目下创建一个文件夹
(相同的包名称,否则无法实现,com.liulishuo.okdownload.core.file)
2、创建两个类,来重写MultiPointOutputStream 里的方法
3、在Application中OnCreate方法创建新对象
package com.liulishuo.okdownload.core.file;
import androidx.annotation.NonNull;
import com.liulishuo.okdownload.DownloadTask;
import com.liulishuo.okdownload.core.breakpoint.BreakpointInfo;
import com.liulishuo.okdownload.core.breakpoint.DownloadStore;
import com.liulishuo.okdownload.core.file.CustomMultiPointOutputStream;
import com.liulishuo.okdownload.core.file.MultiPointOutputStream;
import com.liulishuo.okdownload.core.file.ProcessFileStrategy;
public class CustomProcessFileStrategy extends ProcessFileStrategy {
@Override
@NonNull
public MultiPointOutputStream createProcessStream(@NonNull DownloadTask task,
@NonNull BreakpointInfo info,
@NonNull DownloadStore store) {
return new CustomMultiPointOutputStream(task, info, store);
}
}
重写MultiPointOutputStream 里的方法
package com.liulishuo.okdownload.core.file;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.liulishuo.okdownload.DownloadTask;
import com.liulishuo.okdownload.core.Util;
import com.liulishuo.okdownload.core.breakpoint.BreakpointInfo;
import com.liulishuo.okdownload.core.breakpoint.DownloadStore;
import com.liulishuo.okdownload.core.file.DownloadOutputStream;
import com.liulishuo.okdownload.core.file.MultiPointOutputStream;
import java.io.IOException;
public class CustomMultiPointOutputStream extends MultiPointOutputStream {
private static final String TAG = "CustomMultiPointOutputStream";
private final DownloadTask task;
CustomMultiPointOutputStream(@NonNull final DownloadTask task,
@NonNull BreakpointInfo info,
@NonNull DownloadStore store,
@Nullable Runnable syncRunnable) {
super(task, info, store);
this.task = task;
}
public CustomMultiPointOutputStream(@NonNull DownloadTask task,
@NonNull BreakpointInfo info,
@NonNull DownloadStore store) {
this(task, info, store, null);
}
@Override
public synchronized void close(int blockIndex) throws IOException {
final DownloadOutputStream outputStream = outputStreamMap.get(blockIndex);
if (outputStream != null) {
outputStream.close();
synchronized (noSyncLengthMap) {
// make sure the length of noSyncLengthMap is equal to outputStreamMap
outputStreamMap.remove(blockIndex);
noSyncLengthMap.remove(blockIndex);
}
Util.d(TAG, "OutputStream close task[" + task.getId() + "] block[" + blockIndex + "]");
}
}
}
在Application中OnCreate方法添加
OkDownload.setSingletonInstance(
new OkDownload.Builder(this)
.processFileStrategy(new CustomProcessFileStrategy())
.build()
);
然后,就可以正常下载啦!!!