Android JetPack Compose: Как остановить выполнение COUROUTINE, запускаемой в `Productestate '?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android JetPack Compose: Как остановить выполнение COUROUTINE, запускаемой в `Productestate '?

Сообщение Anonymous »

Цель
У меня есть вычисления тяжелой функции Расчеты: (String) -> Последовательность .
Я хочу загрузить выходы этого расчета, показывая прогресс пользователю и поддержание адаптации пользовательского интерфейса. Я также хочу отменить этот расчет в случае изменения ввода пользователя, и запустить снова, как только пользователь нажимает кнопку. Внутри производительности я передаю это вычисление не-мэйн-дисператорам, чтобы сохранить отзывчивый пользовательский интерфейс. Я также собираю элементы, излучаемые из этой последовательности, и обновляю прогресс по каждому полученному элементу. < /P>
val totalSize = 255 // for sake of this example
var input by rememberSaveable(stateSaver = TextFieldValue.Saver) {
mutableStateOf(TextFieldValue("Test Input"))
}
var doCalculation by rememberSaveable(input) {
mutableStateOf(false)
}
val resultState by produceState(
State.Null as State,
input,
doCalculation,
) {
value = DealingState.Null
if (!doCalculation) {
value = DealingState.Null
return@produceState
}

value = DealingState.Loading(
progress = 0,
required = totalSize,
)

launch(Dispatchers.Default) {
runCatching {
val resultList = mutableListOf()
calculateItems(input).forEach {
resultList.add(it)
value = State.Loading(
progress = resultList.size,
required = totalSize,
)
}
value = State.Success(resultList)
}.getOrElse {
value = State.Failure(it)
}
}
}

Что я попробовал
Я попробовал следующие вещи:

Определите сферу цифрового прицела специально для этой подпрограммы и Call.cancel () , когда будет создано новое состояние.val scope = CoroutineScope(Dispatchers.Default)
val resultState by produceState(...) {
scope.cancel()
....
scope.launch(Dispatchers.Default) {...}
}
< /code>

Храните задание от запуска < /code> и отменить задание или детей < /li>
< /ul>
var job: Job? = null
val resultState by produceState(...) {
job?.cancel() // and job?.cancelChildren()
....
job = launch(Dispatchers.Default) {...}
}


Подробнее здесь: https://stackoverflow.com/questions/795 ... d-in-produ
Ответить

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

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

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

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

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