MutableLiveData, использованные в LazyColumn, приводят к зависанию пользовательского интерфейса ⇐ Android
-
Anonymous
MutableLiveData, использованные в LazyColumn, приводят к зависанию пользовательского интерфейса
Я пытаюсь реализовать простой потребитель 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(), но ничего не помогает...
Спасибо, что уделили время.
Я пытаюсь реализовать простой потребитель 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(), но ничего не помогает...
Спасибо, что уделили время.
Мобильная версия