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
相关产品推荐
相关产品推荐

