Котлин сопрограмм ждать, пока не закончится блок инициализации
В настоящее время я изучаю сопрограммы и нуждаюсь в вашей помощи:)
Как я могу заставить ждать, пока модернизация инициализируется?
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
блок.