在addOnSuccessListener中遍历UploadTask遇类型转换错误,如何获取图片下载链接?
问题原因及解决方法
错误根源
Tasks.whenAllSuccess<UploadTask>(tasks)的泛型声明错误。whenAllSuccess会收集每个上传任务完成后的**UploadTask.TaskSnapshot**实例,而非UploadTask本身。你强行将返回的Snapshot转成UploadTask,自然触发ClassCastException。
另外还有个隐藏问题:你复用了同一个ByteArrayOutputStream对象,这会导致所有图片的字节数据叠加在一起,最终上传的是重复/错误的图片内容,每个图片压缩时都要新建独立的ByteArrayOutputStream。
修正后的代码
val tasks = mutableListOf<UploadTask>() listImg.forEach { imgBitmap -> if (bitmap!!.byteCount != imgBitmap.byteCount) { // 每个图片单独创建ByteArrayOutputStream,避免数据重叠 val baos = ByteArrayOutputStream() imgBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos) val data = baos.toByteArray() val uploadTask = spaceRef.putBytes(data) tasks.add(uploadTask) } } // 泛型声明为TaskSnapshot,或省略泛型让编译器自动推断 Tasks.whenAllSuccess<UploadTask.TaskSnapshot>(tasks).addOnSuccessListener { taskSnapshots -> val urls = mutableListOf<Uri>() lifecycleScope.launch { taskSnapshots.forEach { snapshot -> // 从Snapshot获取对应的StorageReference,再获取下载链接 val downloadUrl = snapshot.storage.downloadUrl.await() urls.add(downloadUrl) } // 这里可以使用urls做后续操作,比如保存到数据库 } }
额外说明
- 如果不需要等待所有任务完成再统一处理,也可以在单个
uploadTask的addOnSuccessListener里直接获取下载链接,但whenAllSuccess更适合批量任务的统一收尾。 - 注意处理可能的异常,比如可以在
launch里添加try-catch块捕获下载链接获取失败的情况。
内容的提问来源于stack exchange,提问作者Captai-N
相关产品推荐
相关产品推荐

