Ефективне зчитування даних з Android Jetpack DataStore

Ефективне зчитування даних з Android Jetpack DataStore

6 Березня 2024 в 01:36 28

Android Jetpack DataStore є сучасною заміною для SharedPreferences, пропонуючи більш безпечний та функціональний підхід до зберігання локальних даних. Розробники, які звикли до SharedPreferences, можуть зіткнутися з викликами під час міграції на DataStore, особливо коли мова йде про зчитування збережених значень.

Основна проблема, з якою стикаються розробники, полягає в тому, що DataStore працює з корутинами та Flow API з Kotlin, що змінює підхід до зчитування даних порівняно з SharedPreferences. Щоб гарантувати отримання збереженого значення, потрібен правильний підхід та розуміння роботи з асинхронними операціями.

Ключові концепції та підготовка

Перш ніж глибше зануритися в код, важливо зрозуміти основні концепції DataStore та їх відмінності від SharedPreferences. DataStore пропонує два типи зберігання: Preferences DataStore, який схожий на SharedPreferences і дозволяє зберігати прості ключ-значення, та Proto DataStore, що використовує протоколи буферів для більш структурованого зберігання даних.

Проблема зчитування значень з DataStore

Основною проблемою при роботі з DataStore є асинхронна природа зчитування даних. Ви не можете просто зчитати значення синхронно, як у SharedPreferences. Замість цього, вам потрібно підписатися на потік даних, який асинхронно надсилає оновлення.

Рішення

Щоб ефективно зчитувати дані з DataStore, можна використовувати корутини для управління асинхронним потоком даних. Нижче наведено приклад, як отримати збережене значення за допомогою first(), асинхронно очікуючи на його завершення.

У цьому коді використовується корутина, щоб асинхронно дочекатися першого доступного значення з потоку DataStore, що дозволяє надійно отримати збережене значення. dataStore.data.first() чекає на завантаження даних з DataStore і повертає перший доступний набір налаштувань.

Покращення підходу

Хоча використання first() може бути ефективним для одноразових запитів, для постійного спостереження за змінами краще використовувати collect з Flow API. Це дозволить вашому додатку реагувати на зміни даних в реальному часі.

У цьому прикладі getAccountName створює новий потік, який перетворює поточний потік Preferences на потік значень account_name, дозволяючи підписатися на нього та реагувати на будь-які зміни в цьому значенні.

Висновок

Перехід від SharedPreferences до Jetpack DataStore вимагає зміни підходу до зчитування даних через асинхронну природу останнього. Використання корутин і Flow API з Kotlin дозволяє не тільки надійно зчитувати збережені значення, але й спостерігати за їх змінами в реальному часі. Розуміння та правильне застосування цих інструментів відкриває двері до створення більш надійних та відповідних користувачеві додатків на платформі Android.