Обновление значения Stateflow из нескольких потоковAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Обновление значения Stateflow из нескольких потоков

Сообщение Anonymous »

Я сталкиваюсь с проблемой, в которой при обновлении значения Stateflow в ViewModel из нескольких потоков, для некоторых значений, которое я не получаю в UI.
В качестве эксперимента я попробовал следующее < /p>
Ниже приведен код ViewModel. < /p>

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

class MainViewModel : ViewModel() {

private val _value = MutableStateFlow(-1)
val value = _value.asStateFlow()

var count = 0

fun startUpdate() {
viewModelScope.launch(Dispatchers.IO) {
async {
updateFrom1()
}
async {
updateFrom1000()
}
}
}

fun updateValue(value: Int) {
_value.update { value }
}

suspend fun updateFrom1() = withContext(Dispatchers.IO) {
for (i in 1..1000) {
updateValue(i)
Log.d("Ujjwal", "UpdateFrom1 :$i")
}
}

suspend fun updateFrom1000() = withContext(Dispatchers.IO) {
for (i in 1000 downTo 1) {
updateValue(i)
Log.d("Ujjwal", "UpdateFrom1000 :$i")
}
}
}
< /code>
И вот мой код деятельности < /p>
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val viewmodel = MainViewModel()
setContent {
MyApplicationTheme {
// A surface container using the 'background' color from the theme
MyFunction(viewmodel)
}
}
}
}

@Composable
fun MyFunction(viewModel: MainViewModel) {
val value by viewModel.value.collectAsState()

when (value) {
else -> {
viewModel.count = viewModel.count + 1
Text(text = "value is ${viewModel.count}")
Log.d("Ujjwal", "count is : ${viewModel.count}")
}
}

LaunchedEffect(Unit ){
viewModel.startUpdate()
}
}
Мое ожидание в конце, я хочу, чтобы значение COUNT было 2000 (то есть он должен быть выполнен для всех обновлений _value )
Для функции я попробовал следующий вариант, но ни один из них не сработал < /p>
fun updateValue(value: Int) {
_value.update { value }
}

fun updateValue(value: Int) {
viewModelScope.launch {
_value.update { value }
}
}

fun updateValue(value: Int) {
viewModelScope.launch(Dispatchers.IO) {
_value.update { value }
}
}

fun updateValue(value: Int) {
viewModelScope.launch(Dispatchers.IO) {
_value.value = value
}
}

fun updateValue(value: Int) {
viewModelScope.launch {
_value.value = value
}
}

fun updateValue(value: Int) {
viewModelScope.launch {
_value.emit(value)
}
}

fun updateValue(value: Int) {
viewModelScope.launch(Dispatchers.IO) {
_value.emit(value)
}
}

suspend fun updateValue(value: Int) = withContext(Dispatchers.IO) {
_value.emit(value)
}

suspend fun updateValue(value: Int) = withContext(Dispatchers.IO) {
_value.value = value
}

fun updateValue(value: Int) {
viewModelScope.launch {
mutex.withLock {
_value.value = value
}
}
}
< /code>
Есть ли что -то, чего мне не хватает, или у меня есть неправильное предположение о том, как должно вести себя Stateflow? COUNT (обычно около 8-14). < /p>
Если в случае, если мы обязаны потерять событие, есть ли способ захватить эти события, что наиболее важно, чтобы захватить последнее значение, по крайней мере (последнее значение)

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

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

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

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

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

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