Ожидание сопрограммы в приложении Android onCreateAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Ожидание сопрограммы в приложении Android onCreate

Сообщение Anonymous »

В onCreate моего приложения я хотел бы выполнить некоторую инициализацию асинхронно. Я пытаюсь сделать это с помощью сопрограмм. У меня есть список конфигураторов, и вот как я пытаюсь их выполнить:

Код: Выделить всё

runBlocking {
configurators.map { configurator ->
async(Dispatchers.IO) {
val test = measureTime {
configurator(data)
}
println("TestLog configurator $test")
}
}.awaitAll()
}
Я знаю, что мне не следует использовать runBlocking, но поскольку я вызываю это в onCreate, мне нужно подождать два, пока все конфигураторы не завершатся, прежде чем я смогу двигаться дальше Я подумал, что попробую этот подход. Я думаю, что этот код будет выполняться асинхронно и быстрее, чем синхронный цикл for. Однако, когда я измеряю время выполнения, я обнаруживаю, что этот код сопрограммы занимает немного больше времени. Я также заметил, что конфигуратор, который при использовании этого подхода с сопрограммами занимает больше всего времени, занимает еще больше времени. Вот случаи использования этого кода сопрограммы:

Код: Выделить всё

TestLog configurator 2.149699ms
TestLog configurator 1.985107ms
TestLog configurator 1.943238ms
TestLog configurator 3.609008ms
TestLog configurator 1.754272ms
TestLog configurator 4.267985ms
TestLog configurator 12.681193ms
TestLog configurator 3.479208ms
TestLog configurator 6.786743ms
TestLog configurator 6.479004ms
TestLog configurator 5.150676ms
TestLog configurator 9.146891ms
TestLog configurator 4.942342ms
TestLog configurator 12.432902ms
TestLog configurator 13.672852ms
TestLog configurator 22.583985ms
TestLog configurator 22.687622ms
TestLog configurator 28.136719ms
TestLog configurator 35.068888ms
TestLog configurator 93.862549ms
TestLog configurator 128.712280ms
TestLog configurator 145.591919ms
TestLog configurator 227.555623ms
TestLog configurator 424.756103ms
TestLog all configurators 438.467042ms
А вот и время для обычного цикла for и его синхронного вызова:

Код: Выделить всё

TestLog configurator 1.398397ms
TestLog configurator 402.629us
TestLog configurator 27.307211ms
TestLog configurator 1.162964ms
TestLog configurator 589.641us
TestLog configurator 3.432984ms
TestLog configurator 2.326783ms
TestLog configurator 125.085449ms
TestLog configurator 3.446045ms
TestLog configurator 640.096us
TestLog configurator 2.284750ms
TestLog configurator 119.363078ms
TestLog configurator 1.547079ms
TestLog configurator 12.387736ms
TestLog configurator 807.942us
TestLog configurator 2.764038ms
TestLog configurator 3.534994ms
TestLog configurator 55.678955ms
TestLog configurator 696.94us
TestLog configurator 1.996907ms
TestLog configurator 453.165us
TestLog configurator 756.673us
TestLog configurator 515.3us
TestLog configurator 1.412923ms
TestLog all configurators 374.249430ms
Полагаю, это как-то связано с тем, что я использую runBlocking, но я не совсем понимаю, что именно здесь происходит. И возможно ли как-то добиться того, чего я хочу? Приостановить основной поток в onCreate и заставить его ждать завершения моих конфигураторов?

Подробнее здесь: https://stackoverflow.com/questions/793 ... n-oncreate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»