Приходится использовать много вложенных циклов в дисериализаторе
Какие циклы?! Data-классы создали и все. Нужен список, делаете поле List внутри data-класса.
ответ приходит медленнее чем главный поток, возвращает результат из функции.
Да как же можно так код криво писать. Вы вызываете метод, в котором лежит обратный вызов. Пока метод не обработает, он ничего не вернёт. Поэтому при вызове в первый раз вам вернётся ваш объект с Null. В котлине использовать Null?! Его для этого что ли создавали?!
video = response.body()?.item
Что это?? Где проверки на возвращенный сервером код? 400 ошибку(код) вернёт сервер, и вылетит ваша программа!
Thread.sleep(1000)
Нормально, UI поток тормозить. Да и ладно, что приложение не будет реагировать на действия пользователя секунду. Да?!
Ответ: Все действия с сетью делайте асинхронно. Вернул retrofit ответ, проверили его на корректность, вызвали там же метод для обновления ui и сидите радуйтесь.