Оптимальный способ сбора многих потоков, которые представляют состояние пользовательского интерфейса в JetPack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Оптимальный способ сбора многих потоков, которые представляют состояние пользовательского интерфейса в JetPack Compose

Сообщение Anonymous »

Я пытаюсь перейти на JetPack Compose в моем приложении Android. Мой экран содержит множество флагов, и каждый элемент должен быть виден (и начать получать данные), только если соответствующий флаг установлен на TRUE. Проблема в том, что я обновляю данные элемента с использованием потоков, и я осторожно, что слишком много потоков может привести к замораживанию в основном потоке и задержке.

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

data class UiState(
val showFavoriteBlock: Boolean,
val showRecentlyVisitedBlock: Boolean,
val showMostPopularBlock: Boolean,
val showSubscriptionBlock: Boolean,
val showFriendsBlock: Boolean,
val showRelatedBlock: Boolean,
val showLatestVisitedBlock: Boolean,
// There is 10+ same flags

// And here I have content for each block which starts loading after we receive flag
val favorites: Flow[*]>,
// 10+ flows for each block
)
< /code>
Прямо сейчас у меня есть следующий код для корневой композиционной функции < /p>
@Composable
fun ExampleScreen(uiState: UiState){
// We don't show screen untill all flags will be received,
// flags itself are simple Booleans. But content for them is flow

LazyColumn {
// reading flag's value doesn't force recomposition
// because it's not State and can't be changed
if(uiState.showFavoriteBlock){
item{
// we sending flow, so updates in flow right now
// cannot force recomposition of screen
FavoritesBlock(uiState.favorites)
}
}
// 10+ items for each block
...
}
}
< /code>
И вот мой недавновизированный Block Composable: < /p>
@Composable
fun RecentlyVisitedBlock(recentlyVisitedFlow: Flow) {
// recentlyVisited is State
val recentlyVisited by recentlyVisitedFlow.collectAsStateWithLifecycle()

Row {
// Here I'm reading state and this causes recomposition for all RecentlyVisitedBlock
// So recomposition happens only when we receive new data from flow
}
}
< /code>
Как видите, я собираю более 10 потоков в композиционных функциях. И ... это нормально?
Все примеры в CodeLabs, JetPack Compose Примеры и учебные пособия содержит около 3-4 потоков. Но реальные приложения могут иметь около 20-30 (или даже больше) потоков, которые часто могут выделять данные. Можно работать с потоками в фоновом режиме, но здесь я собираю их все на UI. Может ли это привести к проблемам с производительностью? Поскольку основной поток должен обрабатывать все из них
[*] Я могу объединить все потоки в одном внутри UISTATE, а затем использовать FilterisInstance 
для фильтрации и отправлены на каждый композиционный только его данные. В этом случае у меня все еще есть 10+ вызовов функции CollectAsstate , но, по крайней мере, есть только один поток вместо 10+. Можно ли изменить потоки на пользовательском интерфейсе? Объедините их, карту, фильтр. Но в этом случае у меня будет 10+ потоков и 10+ аналогичных значений состояния. Похоже, плохой паттерн
Что если я изменю свой экран на примеры (Uistate: Flow ) . В этом случае у меня есть только 1 поток с одним вызовом CollectAsstateWithLifeCycle , но это приведет к переработке корня при каждом изменении. Кроме того, я могу использовать ReviveStateOF и пропустить переоценки некоторых детей. Что лучше: есть несколько потоков, которые собирают и начнут состояние чтения независимо или имеют 1 поток, который вызывает переоборудование корня в каждом обновлении? Во втором случае
вам понадобится одно состояние для каждого значения (например: электронная почта, пароль,
загрузка, ошибка и т. Д.). Проблема заключается в том, что в вашем ViewModel и ваших композиционных продуктах будет много состояний
. С другой стороны, вторая параметр
лучше подходит для обработки переоборудования. Uistate (https://developer.android.com/jetpack/c ... n-ui-state), который излучает класс данных с 50+ полками, которые пересказывают весь экран или 2) Индивидуальные поля с меньшими откомплектованием.

Подробнее здесь: https://stackoverflow.com/questions/765 ... ck-compose
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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