Продолжение возобновления не работает, когда приложение работает в фоновом режиме - PullRequest
2 голосов
/ 10 июля 2020

Например, у меня есть такая конструкция:

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, но меня интересует способ исправить текущую версию, поскольку у сопрограммы есть оболочка, которая контролирует прогресс в начале и в конце сопрограммы.

...