Котлин сопрограмм ждать, пока не закончится блок инициализации

В настоящее время я изучаю сопрограммы и нуждаюсь в вашей помощи:)

Как я могу заставить ждать, пока модернизация инициализируется?

private lateinit var retrofit: Retrofit

init {
    val time = measureTimeMillis {
        launch {
            val httpClient = createOkHttpClient(...)
            val gson = createGson()
            retrofit = createRetrofit(httpClient.await(), gson.await())}
    }
    logger.debug("Init time: $time")
}

 private fun <T> createService(class: Class<T>) = retrofit.create(_class)

С runBlocking это работает, но я действительно не хотел использовать это...

Заранее спасибо!

1 ответ

Как я могу заставить ждать инициализации моего объекта?

Сопрограммы не могут помочь вам здесь. Если до перехода к сопрограммам вы могли позволить себе блокировать основной поток пользовательского интерфейса во время инициализации Retrofit, оставьте его таким, и не задействуйте сопрограммы.

Если у вас была асинхронная задача, которая выполнялась в фоновом режиме, то какими бы ни были последствия позднего init, они также останутся с сопрограммами.

Единственное преимущество, которое дают сопрограммы, - это чистая модель программирования:

    launch {
        val httpClient = createOkHttpClient(...)
        val gson = createGson()
        retrofit = createRetrofit(httpClient.await(), gson.await())
        ... take the actions that depend on retrofit ...
    }

Ваша сопрограмма возобновится в потоке пользовательского интерфейса один раз httpClient а также gson инициализировали. Затем он может предпринять действия, которые будут способствовать инициализации вашего приложения. В то же время деятельность onCreate завершена, поэтому вы должны переместить все, что у вас там было, что зависит от модернизации, в launch блок.

Другие вопросы по тегам