Современный подход к разработке с использованием Kotlin

kotlin

How to Show Download Progress, Kotlin-Style — неболь­шая статья с хорошей иллюс­тра­цией сов­ремен­ных под­ходов к раз­работ­ке на при­мере диало­га заг­рузки фай­ла.

Ког­да‑то, на заре ста­нов­ления Android как самой популяр­ной плат­формы, по сети гуляло мно­жес­тво при­меров реали­зации подоб­ной фун­кци­ональ­нос­ти. Обыч­но все сво­дилось к исполь­зованию AsyncTask и  runOnUiThread(<wbr />), а сам код выг­лядел как весь­ма далекая от пат­терна MVC мешани­на клас­сов и методов.

РЕКОМЕНДУЕМ:
Как сделать код на Kotlin более понятным

Се­год­ня у нас есть мощ­ные инс­тру­мен­ты асин­хрон­ного прог­рамми­рова­ния, поз­воля­ющие сде­лать этот код гораз­до чище, понят­нее и надеж­нее. И все это с исполь­зовани­ем стан­дар­тных средств и биб­лиотек раз­работ­ки.

Итак, для начала соз­дадим sealed-класс для управле­ния сос­тоянием заг­рузки:

Sealed-клас­сы отли­чают­ся тем, что могут иметь толь­ко огра­ничен­ный и заранее опре­делен­ный набор потом­ков. Нам нуж­но все­го три сос­тояния: заг­рузка завер­шена, ошиб­ка заг­рузки, текущий прог­ресс заг­рузки.

Те­перь реали­зуем саму фун­кцию заг­рузки:

Это фун­кция‑рас­ширение для клас­са HttpClient Kotlin-биб­лиоте­ки Ktor. Как рас­ширение, она может исполь­зовать методы клас­са HttpClient нап­рямую, к тому же нам нет необ­ходимос­ти соз­давать спе­циаль­ный ути­лит­ный класс для нее, в осталь­ном коде она будет выг­лядеть как метод клас­са HttpClient.

Кро­ме того что это фун­кция‑рас­ширение, это еще и suspend-фун­кция, которая воз­вра­щает Flow (поток дан­ных), содер­жащий текущее сос­тояние заг­рузки. Это зна­чит, что код в теле фун­кции будет выпол­нен не в момент вызова фун­кции, а в момент получе­ния дан­ных из самого Flow (с помощью метода collect(<wbr />)). Это поз­волит сде­лать код более струк­туриро­ван­ным и понят­ным.

РЕКОМЕНДУЕМ:
Функции-расширения в Kotlin: использовать или нет?

На­конец, напишем фун­кцию, которая будет запус­кать заг­рузку в фоновом потоке и динами­чес­ки обновлять интерфейс при­ложе­ния:

Вся логика в одной неболь­шой фун­кции. Сна­чала запус­каем фоновую корути­ну ( CoroutineScope(<wbr />Dispatchers.<wbr />IO).<wbr />launch), затем запус­каем заг­рузку фай­ла и обновля­ем UI в соот­ветс­твии с получен­ным из Flow сос­тоянием.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий