androidX(10)版本,下载过程中报错 The current offset on block-info isn‘t update correct,块信息上的当前偏移量未正确更新,解决办法

近日,公司修改下载方式为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()
        );

然后,就可以正常下载啦!!!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kstar_Ming_闫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值