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

无网络时Firebase Storage putFile()方法始终无法完成

Firebase Storage putFile()断网时监听器无响应问题解决办法

你遇到的这个情况是Firebase Storage SDK的默认行为导致的:上传任务在断网时会自动重试,不会立刻触发失败监听器,而是一直处于等待网络恢复的状态,所以你的OnFailureListener和OnCompleteListener都不会被触发。

解决办法可以从以下两点入手:

1. 设置上传超时时间

给UploadTask设置超时时间,当断网超过指定时长后,SDK会终止任务并触发失败监听器。

2. 监听任务状态变化

通过addOnStateChangedListener跟踪任务状态,当任务进入PAUSED状态时,可以判断是网络问题导致的,进而做相应处理。

修改后的代码示例:

val storage = FirebaseStorage.getInstance().reference
val remoteImagePath = "images/username/imageName.jpg"
val imageRef = storage.child(remoteImagePath)
val uploadTask = imageRef.putFile(image)

// 设置上传超时时间(示例为30秒,可根据需求调整)
uploadTask.setTimeout(30000)

uploadTask.addOnSuccessListener {
    Log.d("ViewModel", "Success!")
}.addOnFailureListener { error ->
    Log.d("ViewModel", "${error.message}")
}.addOnCompleteListener {
    Log.d("ViewModel", "Completed!")
}.addOnStateChangedListener { task ->
    when (task.state) {
        UploadTask.State.PAUSED -> {
            // 任务暂停,大概率是网络断开
            Log.d("ViewModel", "Upload paused - likely no network")
        }
        UploadTask.State.RUNNING -> {
            Log.d("ViewModel", "Upload running")
        }
        UploadTask.State.SUCCESS -> {
            // 已在OnSuccessListener处理,这里可做额外逻辑
        }
    }
}

补充说明

  • setTimeout的单位是毫秒,设置后如果任务在指定时间内没有完成(比如断网一直无法恢复),就会抛出StorageException并触发失败监听器。
  • 如果你需要更灵活的重试控制,可以自定义重试策略,不过默认的重试机制一般能满足大部分场景,加上超时设置基本就能解决断网无响应的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:40:28