You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AWS S3 TransferObserver在无网络时未触发错误回调且状态未转为FAILED是否为预期行为?

AWS S3 TransferObserver在无网络时未触发错误回调且状态未转为FAILED是否为预期行为?

没错,这其实是AWS Android SDK S3中TransferObserver的预期设计行为,我之前做项目的时候也踩过这个坑,后来翻了SDK的设计逻辑才搞明白来龙去脉~

为什么会出现这种情况?

  • 关于WAITING_FOR_NETWORK状态而非FAILED
    SDK默认的设计是把网络中断当成临时可恢复的状况(比如用户只是暂时走到信号盲区,之后大概率会恢复网络),所以会保持WAITING_FOR_NETWORK状态,等待网络恢复后自动重试上传,不会直接标记为FAILED。这种设计是为了提升上传成功率,避免因为短暂断网就判定任务失败。

  • 关于onError()不触发
    onError()回调只负责处理不可恢复的明确错误——比如S3权限不足、Bucket不存在、请求被服务端拒绝这类确定的错误。无网络属于“临时中断”,并不在SDK定义的“错误”范畴里,所以自然不会触发这个回调。

如果你想要改变这种行为,有这些方案:

  1. 关闭自动重试,让无网络直接转为失败
    你可以在初始化TransferUtility的时候,通过TransferConfiguration设置重试次数为0,这样SDK就不会尝试重试,遇到无网络时会直接把状态转为FAILED,同时触发onError()

    val transferConfig = TransferConfiguration.Builder()
        .setMaxErrorRetry(0) // 关闭自动重试机制
        .build()
    val transferUtility = TransferUtility.builder()
        .context(context)
        .awsConfiguration(AWSMobileClient.getInstance().configuration)
        .transferConfiguration(transferConfig)
        .build()
    
  2. 自定义超时逻辑
    如果你还是想保留自动重试,但又想在无网络超时后触发自己的错误提示,可以:

    • 结合Android的网络状态监听(比如用ConnectivityManager),当检测到网络断开且TransferObserver处于WAITING_FOR_NETWORK状态超过你设定的时间(比如30秒),就手动触发自己的错误处理逻辑。
    • onStateChanged回调里记录进入WAITING_FOR_NETWORK的时间,之后用定时器定期检查,一旦超时就执行对应的提示或清理操作。

这样应该就能满足你不同的业务需求啦😉

火山引擎 最新活动