Например, у меня есть такая конструкция:
lifecycleScope.launch {
viewModel.handleAppLoad() {
val app = AppFactory.createApp(
context = Application.instance.applicationContext
)
app.doSmth()
startActivity(
SuccessActivity.createIntent(
requireContext()
)
)
}
}
В моем коде фрагмента, когда я нажимал какую-то кнопку.
suspend fun handleAppLoad(
scope: CoroutineScope = viewModelScope,
block: suspend () -> Unit
) {
scope.launch {
progress.value = true
try {
delay(1000)
block()
} catch (ex: MsalOperationCanceledException) {
// B2C process was cancelled, do nothing
} catch (ex: MsalException) {
_msalErrorEvent.emit(ex)
Timber.e(ex)
}
progress.value = false
}
}
^ Моя оболочка сопрограммы
Также у меня есть этот код в AppFactory.
object AppFactory {
suspend fun createApp(
context: Context
): App {
return suspendCoroutine { cont ->
App.create(
context,
object : IApp.ApplicationCreatedListener {
override fun onCreated(application: App) {
cont.resume(application)
}
override fun onError(exception: Exception) {
cont.resumeWithException(exception)
}
}
)
}
}
}
Проблема в том, что когда приложение переходит в фоновый режим, а обратный вызов cont.resume(application)
работает в фоновом режиме, сопрограмма не останавливается, а продолжает ждать для того же cont.resume(application)
, поэтому мой прогресс остается активным, а cont.resume(application)
уже произошло. Я знаю способ исправить это, удалив конструкцию callback-> coroutine, но меня интересует способ исправить текущую версию, поскольку у сопрограммы есть оболочка, которая контролирует прогресс в начале и в конце сопрограммы.