gpt4 book ai didi

java - CountDownLatch 不释放线程

转载 作者:搜寻专家 更新时间:2023-11-01 09:40:18 28 4
gpt4 key购买 nike

我有一个方法,它从 Firebase 存储加载图像。它在后台线程中调用,我需要阻止它,直到加载图像(以避免回调 hell )。这是代码(在 Kotlin 中)

override fun fromNet(): Bitmap? {
Log.wtf(TAG, "$name loading from firebase")
var result: Bitmap? = null
val lock = CountDownLatch(1)
try {
FirebaseStorage.getInstance().getReferenceFromUrl(FIRE_STORAGE).child(ctx.getKGL().famkey)
.child(name).getBytes(524288L)
.addOnFailureListener {
Log.wtf(TAG, "$name load failure")
lock.countDown()
}
.addOnSuccessListener { bytes ->
Log.wtf(TAG, "$name loaded")
val b = BitmapFactory.decodeByteArray(bytes, 0, bytes.size).scale(ctx.dip(64))
result = b
lock.countDown()
ctx.saveToCache(name, b)
}
.addOnCompleteListener {
Log.wtf(TAG, "on complete")
lock.countDown()
}
} catch (ignored: NullPointerException) { lock.countDown() }
lock.await()
return result
}

但是线程永远处于阻塞状态

日志:

A/MemberPhoto: xvd6z67gZfMCLG4c9mkGXKe9ML53 load failure
A/MemberPhoto: on complete

UPD:可能是因为 Firebase 代码是 Java,而我的代码是 Kotlin?

最佳答案

如果你想确定 lock.await()不会让您当前的线程永远等待,您需要确保 lock.countDown()被称为 whatever happen 所以在这里你应该用 try/finally 包围阻止您的听众的代码以调用 lock.countDown()finally 内堵塞。

实际上,如果例如 BitmapFactory.decodeByteArray(bytes, 0, bytes.size).scale(ctx.dip(64)),则与您当前的代码不同。失败,lock.countDown()永远不会被调用,这将使线程调用 lock.await()永远等待。

例如,如果成功,您的监听器代码应该是:

.addOnSuccessListener { bytes ->
try {
Log.wtf(TAG, "$name loaded")
val b = BitmapFactory.decodeByteArray(bytes, 0, bytes.size).scale(ctx.dip(64))
result = b
} finally {
lock.countDown()
}
ctx.saveToCache(name, b)
}

关于java - CountDownLatch 不释放线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40309776/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com