Я написал эту функцию расширения, которая удовлетворяет моим потребностям:
suspend fun AsyncLayoutInflater.inflateSuspended(@LayoutRes resid: Int, parent: ViewGroup?): View {
return suspendCoroutine { continuation ->
inflate(resid, parent) { view, _, parent ->
continuation.resume(view)
}
}
}
Но я не уверен, как использовать ее без блокировки пользовательского интерфейса.Я попробовал Dispatchers.IO, но получил RuntimeException: не могу создать обработчик внутри потока, который не вызвал Looper.prepare ()
Как мне использовать эту функцию?
Обновление: Я обнаружил, что inflate
не останавливает интерфейс, но добавляет ViewView.calendarHolder
находится внутри ScrollView
.Прокрутка останавливается прямо перед отображением CalendarView на экране.
val inflater = AsyncLayoutInflater(this)
val startTime = System.currentTimeMillis()
coroutineScope.launch {
val startTimeInside = System.currentTimeMillis()
repeat(100) {
calendarView = inflater.inflateSuspended(R.layout.layout_calendar, calendarHolder)
as MaterialCalendarView
}
val addViewStart = System.currentTimeMillis()
calendarHolder.addView(calendarView)
val endTimeInside = System.currentTimeMillis()
Timber.i("inflate: ${endTimeInside - startTimeInside}")
Timber.i("addView: ${endTimeInside - addViewStart}")
setupCalendar()
}
val endTime = System.currentTimeMillis()
Timber.i("outside: ${endTime - startTime}")
Даже если журнал показывает это:
снаружи: 2 накачивания: 2105 addView: 5