You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端Vimeo+Tus上传无报错但几秒后停滞问题

排查Vimeo TUS上传uploadChunk()冻结的问题

结合你描述的场景(进度到5%停滞,uploadChunk()执行时冻结)和提供的代码,我整理了几个可能的排查方向和解决方案:

1. 调整Chunk Size设置

你当前设置的uploader.setChunkSize(1024)是1KB的块,这个尺寸太小了,会导致频繁发起请求,容易触发客户端连接池耗尽或者服务器端的限流机制,进而导致请求挂起无响应。建议把块大小调整到更合理的范围,比如1MB或更大:

uploader.setChunkSize(1024 * 1024); // 设置为1MB的块大小

2. 补充超时配置

你的代码里设置了Connection: Keep-Alive,但如果客户端没有配置读取和连接超时,当服务器没有及时响应时,请求会一直挂起,表现为代码冻结。给你的client添加超时参数:

client.setConnectTimeout(15000); // 15秒连接超时
client.setReadTimeout(30000);    // 30秒读取超时

这样在服务器无响应时,请求会主动抛出超时异常,而不是一直冻结。

3. 增加异常捕获与日志输出

当前的循环逻辑没有处理可能的异常,uploadChunk()可能抛出了IO异常但没有任何提示,导致代码看起来像是冻结。建议给循环添加try-catch块,打印详细日志帮助定位问题:

while (!isCancelled() && uploader.getOffset() < totalBytes) {
    try {
        long uploadedBytesInChunk = uploader.uploadChunk();
        if (uploadedBytesInChunk <= 0) {
            break; // 没有上传字节,退出循环
        }
        uploadedBytes = uploader.getOffset();
        publishProgress(uploadedBytes, totalBytes);
    } catch (IOException e) {
        System.err.println("上传Chunk时出现异常: " + e.getMessage());
        e.printStackTrace();
        // 可选:添加重试逻辑,比如等待1秒后重试当前Chunk
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
        }
    }
}

4. 校验Upload Offset一致性

虽然你确认了upload_link正确,但可以在循环开始前手动校验本地offset和服务器端的一致性,避免因offset不匹配导致的上传阻塞:

// 手动获取服务器端的当前offset
long serverOffset = uploader.getOffset();
if (serverOffset != uploadedBytes) {
    System.out.println("本地偏移量与服务器不一致,更新为服务器值: " + serverOffset);
    uploadedBytes = serverOffset;
}

5. 考虑服务器端临时限流

Vimeo的服务器可能对频繁的小请求有限流策略,或者临时出现了服务波动。如果调整了chunk size和超时后仍然出现冻结,可以在异常捕获后添加短暂延迟再重试,避免连续发起请求触发限流。

内容的提问来源于stack exchange,提问作者Petar LjubicOfficial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:22:40