无网络时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
相关产品推荐
相关产品推荐

