Я разрабатываю приложение для Android с помощью JetPack Compose, где мне нужно отобразить до 9000 изображений из хранилища устройства в LazyverticalGrid. Моя текущая реализация работает, но борется с производительностью и скоростью. Изображения загружаются партиями, но пользовательский интерфейс иногда отстает или изображения не могут загружаться во времени, особенно с большими библиотеками. < /P>
Вот упрощенная версия моей реализации: < /p>
@Composable
fun MediaGridScreen(context: Context) {
val mediaList = remember { mutableStateListOf() }
var lastLoadedIndex by remember { mutableStateOf(0) }
val batchSize = 100
// Load batches of media URIs
LaunchedEffect(lastLoadedIndex) {
val newMedia = loadMediaFromDevice(context.contentResolver, lastLoadedIndex, batchSize)
if (newMedia.isNotEmpty()) {
mediaList.addAll(newMedia)
lastLoadedIndex += newMedia.size
}
}
LazyVerticalGrid(
columns = GridCells.Fixed(3),
modifier = Modifier.fillMaxSize()
) {
items(mediaList.size) { index ->
MediaItem(mediaUri = mediaList[index])
}
}
}
@Composable
fun MediaItem(mediaUri: Uri) {
Image(
painter = rememberAsyncImagePainter(
model = mediaUri,
placeholder = painterResource(android.R.drawable.ic_menu_gallery)
),
contentDescription = null,
modifier = Modifier
.padding(4.dp)
.aspectRatio(1f)
.fillMaxWidth(),
contentScale = ContentScale.Crop
)
}
fun loadMediaFromDevice(contentResolver: ContentResolver, startIndex: Int, batchSize: Int): List {
val mediaList = mutableListOf()
val queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Images.Media._ID)
val sortOrder = "${MediaStore.Images.Media.DATE_TAKEN} DESC LIMIT $batchSize OFFSET $startIndex"
val cursor = contentResolver.query(queryUri, projection, null, null, sortOrder)
cursor?.use {
val idColumn = it.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (it.moveToNext()) {
val id = it.getLong(idColumn)
val contentUri = Uri.withAppendedPath(queryUri, id.toString())
mediaList.add(contentUri)
}
}
return mediaList
}
< /code>
То, что я пробовал: < /p>
Загрузка изображений 100 из 100 с использованием MediaStore и обновление LazyverticalGrid при загрузке новых партий.
Использование MamessyncimagePainter от катушки для обработки изображения. Производительность ухудшается с большим количеством изображений.
Некоторые изображения занимают слишком много времени, чтобы загрузить пользовательский интерфейс, что делает пользовательский интерфейс неприятным. Сетки изображений, чтобы минимизировать отставание пользовательского интерфейса?
Должен ли я рассмотреть возможность предварительной перебранной, кэширования или параллельной загрузки для повышения производительности?
ограничения: < /p>
Изображения должны отображаться в сетке с динамической прокруткой.>
Подробнее здесь: https://stackoverflow.com/questions/792 ... ck-compose
Как эффективно загрузить 9000 изображений в LazyverticleGrid в JetPack Compose? ⇐ Android
Форум для тех, кто программирует под Android
1754948459
Anonymous
Я разрабатываю приложение для Android с помощью JetPack Compose, где мне нужно отобразить до 9000 изображений из хранилища устройства в LazyverticalGrid. Моя текущая реализация работает, но борется с производительностью и скоростью. Изображения загружаются партиями, но пользовательский интерфейс иногда отстает или изображения не могут загружаться во времени, особенно с большими библиотеками. < /P>
Вот упрощенная версия моей реализации: < /p>
@Composable
fun MediaGridScreen(context: Context) {
val mediaList = remember { mutableStateListOf() }
var lastLoadedIndex by remember { mutableStateOf(0) }
val batchSize = 100
// Load batches of media URIs
LaunchedEffect(lastLoadedIndex) {
val newMedia = loadMediaFromDevice(context.contentResolver, lastLoadedIndex, batchSize)
if (newMedia.isNotEmpty()) {
mediaList.addAll(newMedia)
lastLoadedIndex += newMedia.size
}
}
LazyVerticalGrid(
columns = GridCells.Fixed(3),
modifier = Modifier.fillMaxSize()
) {
items(mediaList.size) { index ->
MediaItem(mediaUri = mediaList[index])
}
}
}
@Composable
fun MediaItem(mediaUri: Uri) {
Image(
painter = rememberAsyncImagePainter(
model = mediaUri,
placeholder = painterResource(android.R.drawable.ic_menu_gallery)
),
contentDescription = null,
modifier = Modifier
.padding(4.dp)
.aspectRatio(1f)
.fillMaxWidth(),
contentScale = ContentScale.Crop
)
}
fun loadMediaFromDevice(contentResolver: ContentResolver, startIndex: Int, batchSize: Int): List {
val mediaList = mutableListOf()
val queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Images.Media._ID)
val sortOrder = "${MediaStore.Images.Media.DATE_TAKEN} DESC LIMIT $batchSize OFFSET $startIndex"
val cursor = contentResolver.query(queryUri, projection, null, null, sortOrder)
cursor?.use {
val idColumn = it.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (it.moveToNext()) {
val id = it.getLong(idColumn)
val contentUri = Uri.withAppendedPath(queryUri, id.toString())
mediaList.add(contentUri)
}
}
return mediaList
}
< /code>
То, что я пробовал: < /p>
Загрузка изображений 100 из 100 с использованием MediaStore и обновление LazyverticalGrid при загрузке новых партий.
Использование MamessyncimagePainter от катушки для обработки изображения. Производительность ухудшается с большим количеством изображений.
Некоторые изображения занимают слишком много времени, чтобы загрузить пользовательский интерфейс, что делает пользовательский интерфейс неприятным. Сетки изображений, чтобы минимизировать отставание пользовательского интерфейса?
Должен ли я рассмотреть возможность предварительной перебранной, кэширования или параллельной загрузки для повышения производительности?
ограничения: < /p>
Изображения должны отображаться в сетке с динамической прокруткой.>
Подробнее здесь: [url]https://stackoverflow.com/questions/79265987/how-to-efficiently-load-9-000-images-in-a-lazyverticalgrid-in-jetpack-compose[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия