Firebase 存储上传任务继续永远不会触发
Posted
技术标签:
【中文标题】Firebase 存储上传任务继续永远不会触发【英文标题】:Firebase Storage upload task continuation never fires 【发布时间】:2019-06-22 22:58:11 【问题描述】:我正在处理一个项目,我需要先将图像上传到 Firebase 存储并获取下载 url,然后才能将关联的模型类上传到 Firestore。
我正在尝试使用倒计时锁来阻塞主线程,直到上传完成。我知道那里有更好的方法,可以随意推荐一些,但我想我可以通过一个简短的加载屏幕。问题是 getDownloadurl 任务的回调永远不会被调用。我已经搜索和搜索,无法弄清楚。现在我的代码直接来自文档。
fun uploadListing(listing: Listing, images: ArrayList<ByteArray>, onCompleteListener: () -> Unit = )
val listingRef = FirebaseFirestore.getInstance().collection(LISTINGS_COLLECTION).document()
val storageRef = FirebaseStorage.getInstance().reference
listing.id = listingRef.id
val countDownLatch = CountDownLatch(images.size)
var i = 0
images.forEach
val imageRef = storageRef.child("images/$listing.id/$i")
val uploadTask = imageRef.putBytes(it)
uploadTask.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>> task ->
if (!task.isSuccessful)
task.exception?.let exception ->
throw exception
return@Continuation imageRef.downloadUrl
).addOnCompleteListener task ->
if (task.isSuccessful)
listing.images.add(task.result.toString())
countDownLatch.countDown()
else
// Handle failures
// ...
countDownLatch.await()
listingRef.set(listing).addOnSuccessListener
onCompleteListener()
我的 gradle 依赖项...
dependencies
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.google.firebase:firebase-firestore:17.1.5'
implementation 'com.google.firebase:firebase-storage:16.0.5'
implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.google.firebase:firebase-core:16.0.6'
implementation 'com.squareup.picasso:picasso:2.5.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
// implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.5.3'
implementation 'com.google.code.gson:gson:2.8.5'
【问题讨论】:
【参考方案1】:永远不要阻塞主线程。这通常是一个糟糕的想法(正如您刚刚发现的那样),并可能导致您的应用因 ANR 而崩溃。
如果您想在完成一堆任务时注册另一个回调,请使用Tasks.whenAll() 的变体之一并将您想要完成的所有任务传递给它,然后再进行下一项工作。
【讨论】:
感谢您的回答,这看起来是一个很好的解决方案,可以解决我的问题,所以我会标记为答案。但是,我最终通过使用一种方法来修复它,一次上传一张图像,并在他们的回调中递归调用下一张图像的函数。当最后一张图片上传时,我调用了一个完整的监听器,它通过递归传递,在回调中执行。以上是关于Firebase 存储上传任务继续永远不会触发的主要内容,如果未能解决你的问题,请参考以下文章
无法将文件上传到 Firebase 存储。继续显示“E/StorageException:StorageException 已发生。出现未知错误..'
Google Firebase iOS 构建将文件上传到 Mac 上的存储,但在 iPad 上运行时触发 StorageException