То, что вы ищете, - это способ связать некоторую асинхронную обработку с синхронным контекстом. Если возможно, обычно лучше (на мой взгляд) придерживаться одной модели (syn c или asyn c) во всей базе кода.
Тем не менее, иногда эти обстоятельства находятся вне нашего контроля. Один из подходов, который я использовал в аналогичных ситуациях, включает введение BlockingQueue
в качестве канала данных для передачи данных из контекста asyn c в контекст syn c. В вашем случае это может выглядеть примерно так:
class Demo {
var listSize = 0
fun registerListResult() {
val listAll = FirebaseStorage.getInstance()
.getReference()
.child("MainTimeline/")
.listAll()
val dataQueue = ArrayBlockingQueue<Int>(1)
listAll.addOnSuccessListener { dataQueue.put(it.items.size) }
listSize = dataQueue.take()
}
}
Ключевые моменты:
- существует вариант блокировки интерфейса
Queue
, который будет использоваться для данные конвейера из контекста asyn c (слушателя) в контекст syn c (код вызова) - данные
put()
в очереди в OnSuccessListener
- вызывающем код вызывает метод очереди
take()
, который заставит этот поток блокироваться до тех пор, пока не будет доступно значение
Если это не сработает для вас, надеюсь, это, по крайней мере, вдохновит на некоторые новые мысли!