Котлин сопрограмм ждать, пока не закончится блок инициализации - PullRequest
0 голосов
/ 22 октября 2018

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

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

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 Ответ

0 голосов
/ 22 октября 2018

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

Сопрограммы здесь вам не помогут.Если до перехода к сопрограммам вы могли позволить себе блокировать основной поток пользовательского интерфейса во время инициализации 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.

...