Кэширование в памяти на уровне репозитория для потоков Kotlin на AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Кэширование в памяти на уровне репозитория для потоков Kotlin на Android

Сообщение Anonymous »

Предположим, у вас есть список пользователей, загруженных из удаленного источника данных в вашем приложении Android, и по какой -то причине у вас нет локального DB. Этот список пользователей затем используется во всем вашем приложении в нескольких ViewModel S для выполнения других сетевых запросов, поэтому вы, несомненно, хотели бы, чтобы его кэшировали до тех пор, пока приложение живет и повторно его выбирает по требованию. Это обязательно означает, что вы хотите кэшировать его внутри уровня данных , который является репозиторием в моем случае, чтобы затем получить его из вашего ViewModel s.

это легко сделать в держателе состояния, например, viewmodel - просто сделайте состояние состояния или что угодно. Но что, если мы хотим поток списка (то есть кэшируется в ОЗУ после каждого запроса API), доступного внутри репозитория, а затем собирать из него из уровня пользовательского интерфейса? Что является наиболее тестируемым , stable и правильно способ достижения этого?

Моя первоначальная идея привела к этому:

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

class UsersRepository @Inject constructor(
private val usersApi: UsersApi,
private val handler: ResponseHandler
) {

private val _usersFlow = MutableStateFlow(Resource.Empty)
val usersFlow = _usersFlow.asStateFlow()

suspend fun fetchUserList() = withContext(Dispatchers.IO) {
_usersFlow.emit(Resource.Loading)
_usersFlow.emit(
handler {
usersApi.getUsers()
}
)
}
}
где responsehandler :
class ResponseHandler {
suspend operator fun invoke(block: suspend () -> T) = try {
Resource.Success(block())
} catch (e: Exception) {
Log.e(javaClass.name, e.toString())
val errorCode = when (e) {
is HttpException -> e.code()
is SocketTimeoutException -> ErrorCodes.SocketTimeOut.code
is UnknownHostException -> ErrorCodes.UnknownHost.code
else -> Int.MAX_VALUE
}
Resource.Error(getErrorMessage(errorCode))
}
}
< /code>
Но во время исследования я обнаружил, что в Интернете случайного парня сообщает, что это неправильно: < /p>

В настоящее время Hateflow Hot Hature, поэтому его не рекомендуется использовать в репозитории. Для холодного и реактивного потока вы можете использовать Flow, Channelflow или Callbackflow в репозитории. < /P>
< /blockquote>
он прав? Если он такой, как именно холодные потоки помогают в этой ситуации, и как мы правильно справляемся с ними?>

Подробнее здесь: https://stackoverflow.com/questions/720 ... on-android
Ответить

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

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

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

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

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