Intereting Posts
Ошибка сборки после обновления до Android Studio 3.0 с помощью Kotlin правильное поведение сопрограмм? Как вызвать метод Java Kotlin, который называется с escape-символами? Как получить имена параметров через отражение в котлин? Android Studio 3.0 Canary 1: тесты Kotlin или тесты Java, относящиеся к классам Kotlin, не работают Переключение контекста kotlin coroutine при тестировании Android-презентатора Закрыть / скрыть Softkey от Android с Kotlin как загрузить конфигурацию в spring-webflux без весенней загрузки? Как сделать первичный ключ как автоинкремент для Room Persistence lib Котлин, проблема высокого порядка функций Android Studio 2.2 не может найти ссылки для всех файлов kotlin Как добавить расширение оператора как часть контекста конкретного класса без подкласса? Intellij IDEA отладчик не работает над проектом Gradle Vert.X Kotlin с Android DataBinding в Android Studio 3.0 canary 2 BottomNavigationView ссылку на ViewPager, когда я установил Listener в bottomNavigationView, мне нужно дважды щелкнуть, чтобы выполнить то, что я делаю

Async не ждет ожидания

Я новичок в Котлине и сопрограммах. Однако я хочу использовать его для инициализации библиотеки backport Android 3Ten, которая является долгосрочной задачей. Я использую библиотеку Metalab Async / Await ( co.metalab.asyncawait: asyncawait: 1.0.0 ).

Это мой код:

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val application = this async { //non-blocking initialize ThreeTen await { AndroidThreeTen.init(application) } //initialize UI on UI thread which uses the ThreeTen library initUI() } } 

Теперь у меня проблема с тем, что библиотека не инициализируется при инициализации пользовательского интерфейса. Из моего понимания initUI не следует вызывать до AndroidThreeTen.init .

Короткий ответ заключается в том, что вам не следует использовать сопрограммы Kotlin для этого.

Долгий ответ заключается в том, что ваш код требует, чтобы AndroidThreeTen инициализировался до того, как вы инициализируете свой пользовательский интерфейс, поэтому вам нужно дождаться AndroidThreeTen.init прежде чем пытаться вызвать initUI любом случае. Из-за этой неотъемлемой необходимости ждать, нет никаких оснований для чрезмерного комкомкодирования кода. Корутины не волшебны. Они не будут ждать чего-то, что займет много времени как-нибудь быстрее. AndroidThreeTen.init будет принимать одинаковое количество времени с сопрограммами или без них.

Вы должны просто написать свой код следующим образом:

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val application = this AndroidThreeTen.init(application) initUI() }