1

在我的应用程序中有一个LazyColumn包含嵌套的LazyRows. 我有一个内存问题 - 当网格中有 30-40 行和每行大约 10-20 个元素时,只需垂直向上和向下滚动列表大约 20 次,就有可能达到内存不足 (OOM)。一个项目是一个Card带有一些Boxes和文本。似乎每个项目的结果可组合都被存储了,即使项目没有组合。

这是一个演示这一点的示例。它显示了一个由 600 个元素组成的简单网格(它们只是Text),并且在我的模拟器上使用了大约 200 MB 的内存。(我使用带有横向的 Android TV 模拟器,一次可见 120 个元素)。

MainActivity.kt

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            LazyColumnTestTheme {
                // A surface container using the 'background' color from the theme
                Surface(color = MaterialTheme.colors.background) {
                    runTest()
                }
            }
        }
    }
}

@Composable
fun runTest() {
    var itemsState: MutableState<List<TestDataBlock>> = remember {
        mutableStateOf(listOf())
    }

    LaunchedEffect(Unit) {
        delay(1000)
        itemsState.value = MutableList<TestDataBlock>(30) { rowIndex ->
            val id = rowIndex
            TestDataBlock(id = id.toString(), data = 1)
        }
    }

    List(dataItems = itemsState.value)
}

@Preview
@Composable
fun List(
    dataItems: List<TestDataBlock> = listOf(TestDataBlock("1",1), TestDataBlock("2",2))
) {
    LazyColumn(
        modifier = Modifier
            .fillMaxSize()
    ) {
        itemsIndexed(items = dataItems,
            key = { _, item ->
                item.id
            }
        ) { _, rowItem ->
            drawElement(rowItem)
        }
    }
}

@Composable
fun drawElement(rowItem: TestDataBlock) {
    Text(text = "${rowItem.id}")
    LazyRow() {
        itemsIndexed(items = rowItem.testDataItems,
            key = { _, item ->
                item.id
            }
        ) { _, item ->
            Text(text = "${item.id }", color = Color.Black, modifier = Modifier.width(100.dp))
        }
    }
}

TestDataBlock.kt

@Immutable
data class TestDataBlock(
    val id: String,
    val data: Int,

) {
    val testDataItems: List<TestDataItem> = (0..20).toList().map{ TestDataItem(it.toString()) }
}

TestDataItem.kt

@Immutable
data class TestDataItem(
    val id: String
)
4

0 回答 0