Вот упрощенная версия моей реализации:
Код: Выделить всё
@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
}
Загрузка изображений пакетами по 100 изображений с помощью MediaStore и обновление LazyVerticalGrid по мере загрузки новых пакетов.
Использование RememberAsyncImagePainter из Coil для обработки загрузки изображений.
Отображение заполнителей для изображений, которые все еще загружаются.
Проблема:
Производительность прокрутки ухудшается при большом количестве изображений.
Некоторые изображения загружаются слишком долго, из-за чего пользовательский интерфейс не отвечает.
Приложению иногда трудно эффективно обрабатывать более 9000 изображений, даже при пакетной обработке.
Что Мне нужна помощь:
Как оптимизировать процесс загрузки такого большого количества изображений в Jetpack Compose?
Существуют ли более эффективные методы управления большими сетками изображений для минимизации пользовательского интерфейса задержку?
Следует ли мне использовать предварительную выборку, кэширование или параллельную загрузку для повышения производительности?
Ограничения:
Изображения должны отображаться в сетке с динамической прокруткой.
/>Решение должно эффективно поддерживать большое количество изображений.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ck-compose
Мобильная версия