Как эффективно загрузить 9000 изображений в LazyverticleGrid в JetPack Compose?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как эффективно загрузить 9000 изображений в LazyverticleGrid в JetPack Compose?

Сообщение 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>
Изображения должны отображаться в сетке с динамической прокруткой.>

Подробнее здесь: https://stackoverflow.com/questions/792 ... ck-compose
Ответить

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

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

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

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

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