我当前正在 LazyVerticalGrid
内显示一些位图。为了避免内存不足错误,我尝试执行以下操作来回收位图:
@Composable
fun ComicsList(covers: List<ComicCover>, onComicClicked: (ComicCover) -> Unit) {
LazyVerticalGrid(
columns = GridCells.Fixed(3),
contentPadding = PaddingValues(16.dp),
verticalArrangement = spacedBy(8.dp),
horizontalArrangement = spacedBy(8.dp)
) {
items(
items = covers,
key = { it.id }) {
ComicCoverView(it, onComicClicked)
}
}
}
@Composable
fun ComicCoverView(comic: ComicCover, onComicClicked: (ComicCover) -> Unit) {
Card {
DisposableEffect(
Image(
modifier = Modifier
.height(180.dp)
.clickable { onComicClicked(comic) },
bitmap = comic.cover.asImageBitmap(),
contentDescription = null,
contentScale = ContentScale.FillHeight,
)
) { onDispose { comic.cover.recycle() } }
}
}
但我收到以下错误:
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@eb4ab61
关于如何正确清理资源有什么想法吗?
最佳答案
回收位图的方式没有问题,但问题在于回收它们的位置。
ComicCoverView
每当该项目可见或下一个项目在滚动方向上可见时就会进入合成。
您很可能会回收您希望再次显示的位图,您可以在设置 imageBitmap 之前使用 imageBitmap.asAndroidBitmap().isRecycled
进行验证。
当您完成显示LazyVerticalGrid
时,您应该回收Bitmap
。
关于android - 如何在jetpack compose中释放位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74425685/