MutableLiveData, использованные в LazyColumn, приводят к зависанию пользовательского интерфейсаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 MutableLiveData, использованные в LazyColumn, приводят к зависанию пользовательского интерфейса

Сообщение Anonymous »


Я пытаюсь реализовать простой потребитель MutableLiveData.

Когда я это сделаю:

val tvShowDataResult = MutableLiveData() val liveTvShowDataResult = tvShowDataResult.observeAsState() liveTvShowDataResult.value?.forEach { println(it.name) } значения распечатываются, но когда я хочу отобразить их с помощью LazyColumn, они зависают, также я всегда использовал LiveData таким образом, и это всегда срабатывало:

liveTvShowDataResult.value?.let { LazyColumn(модификатор = Модификатор .fillMaxSize()){ //it.chunked(2).forEach {tvShowPair -> it.chunked(2).forEach {tvShowPair -> элемент{ Ряд( Модификатор .fillMaxWidth() .height(100.dp) .padding(4.dp)){ Столбец ( Модификатор .вес(0,5F) .border(ширина = 1.dp,цвет = MaterialTheme.colorScheme.вторичный) .background(color = MaterialTheme.colorScheme.onBackground)){ val tvShow = tvShowPair.getOrNull(0) если (tvShow! = ноль) { вар isSaved = ложь tvShowSaved.value?.forEach { если (it.id == tvShow.id) { isSaved = правда } } TvShowCard(tvShow = tvShow, isSaved) } } Spacer(Modifier.width(4.dp)) Столбец ( Модификатор .вес(0,5f) .border(ширина = 1.dp,цвет = MaterialTheme.colorScheme.вторичный) .background(color = MaterialTheme.colorScheme.onBackground)){ val tvShow = tvShowPair.getOrNull(1) если (tvShow! = ноль) { вар isSaved = ложь tvShowSaved.value?.forEach { если (it.id == tvShow.id) { isSaved = правда } } TvShowCard(tvShow = tvShow, isSaved) } } } Spacer(Modifier.height(4.dp)) } } } } Пользовательский интерфейс зависает и выходит из строя.

Я отправляю сообщение в LiveData с помощью внешней функции, где LiveData передается как аргумент:

приостановить веселье getAllTvShowsImage(context: Context, tvShowList: List, tvShowLive: MutableLiveData) { val asyncApiCoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) val обновленныйTvShowList = mutableListOf() val okHttpHelper = OkHttpHelperBytes (контекст) val заголовки = ноль tvShowList.forEach {tvShow -> asyncApiCoroutineScope.launch { пытаться{ val responseInBytes = okHttpHelper.get(tvShow.imageUrl, заголовки) val updateTvShow = tvShow.copy(image = responseInBytes) обновленныйTvShowList.add(обновленныйTvShow) //отправляем обновление в основной tvShowLive.postValue(обновленныйTvShowList) }поймать (е:Исключение){ е.printStackTrace() } } } } Это должно сработать, я много чего пробовал...

Использование SnapshotStateList в качестве типа списка

Используем Dispatchers.Main для getAllTvShowsImage(), но ничего не помогает...

Спасибо, что уделили время.
Ответить

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

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

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

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

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