#android #kotlin #kotlin-coroutines #coroutine
#Android #kotlin #kotlin-сопрограммы #сопрограмма
Вопрос:
Я пытаюсь сделать что-то подобное с сопрограммами Kotlin (это псевдокод):
suspend fun myFunction() {
if (job.isActive) {
job.join()
return job.result
} else {
job.start()
job.join()
return job.result
}
}
В основном, чтобы иметь задание, которое выполняет некоторый код и возвращает значение. Затем функция использует это задание. Если задание не запущено, оно выполняет его и возвращает результаты. Если задание уже запущено, оно ожидает его завершения и возвращает свой результат.
Но не уверен, как подойти к этому. Есть предложения?
Ответ №1:
class MyClass(override val coroutineContext: CoroutineContext) : CoroutineScope {
private val lazyThing =
async(start = CoroutineStart.LAZY) {
5 // Calculate using suspending functions as necessary
}
suspend fun getThing() = lazyThing.await()
}
lazyThing
в итоге получается Deferred<Int>
. Его содержимое не будет вычислено до тех пор, пока не будет вызвано в первый раз getThing()
. Оно будет вычислено только один раз, после чего его значение будет немедленно возвращено.
Ответ №2:
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
fun main() {
println(myFunction())
}
fun myFunction(): Int = runBlocking {
aJobAsync().await()
}
suspend fun aJobAsync(): Deferred<Int> = withContext(Dispatchers.Default) {// use Dispatchers.IO for IO intensive task
async {
2 2
}
}
aJobAsync — это вернет отложенное значение, которое может использоваться для извлечения возвращаемого значения заданий
myFunction — это блок блокировки выполнения, что означает, что при вызове myFunction вызывающий поток будет заблокирован. Поскольку нам нужна область сопрограммы для вызова ожидания в задании