Показать загрузчик перед отправкой данных потока в ViewModelAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Показать загрузчик перед отправкой данных потока в ViewModel

Сообщение Anonymous »

У меня есть поток данных, поступающий с сервера. Сервер не предоставляет никакой информации о том, когда поступит следующий фрагмент данных. В моем репозитории есть Flow, который отправляет данные по мере их поступления. Например, в моей тестовой настройке репозиторий выдает данные каждые 5 секунд, но на самом деле данные могут поступить в любое время, и интервал между выбросами не ограничен.
class YourRepository {
private var counter = 0

fun getDataStream(): Flow = flow {
while (true) {
counter++
val newData = YourDataClass(
info = "Update #$counter",
timestamp = System.currentTimeMillis()
)
emit(newData)
delay(5000)
}
}
}

У меня есть два примера реализации кода, и я хочу знать, какой из них лучший. Мое требование состоит в том, чтобы при поступлении новых данных мне нужно было показывать загрузчик или счетчик, ждать 2 секунды, а затем отображать данные в режиме реального времени. Я хочу знать наиболее эффективный и интуитивно понятный способ добиться этого с помощью Flow и StateFlow.
  • Использование FlatMapLatest
class YourViewModel(
private val repository: YourRepository
) : ViewModel() {

// StateFlow for the UI
val uiState: StateFlow = repository
.getDataStream()
.flatMapLatest { data ->
flow {
emit(null) // Show loading initially
delay(2000) // Wait 2 seconds
emit(data) // Show actual data
}
}
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = null
)
}
  • Использование трансформирования
class YourViewModel(
private val repository: YourRepository,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : ViewModel() {

val uiState: StateFlow = repository.getDataStream()
.transform { newData ->

emit(DataUiState.Updating)

delay(2000)
emit(DataUiState.Success(newData))
}
.flowOn(ioDispatcher)
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = DataUiState.InitialLoading
)
}



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

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

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

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

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

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