android - 如何在jetpack compose中释放位图

标签 android bitmap android-jetpack-compose

我当前正在 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/

相关文章:

android - 谷歌地图用多边形模拟折线

c# - 使用 pictureBox sizeMode 裁剪位图克隆已缩放

android - 包含低密度位图的目的是什么?

android - Jetpack Compose TopBar 和 BottomBar Default Elevation 内容未填满其容器

android - 错误 : My app stops working when I use getRunningTasks even when @TargetApi is set to 18

java - 在 Android 中将类放在包名称下的最佳做法是什么

android - 在 Android 上保持 Activity Activity 并正常退出

Android:如何在启动画面上对齐 2 个图像

android - 一起滚动两个 Lazy Scrollers

android - Jetpack 组合状态 : Modify class property