I would like to show user contents of notifications that dispatched from this app since the app had been started.
This app is creating for my learning.

它使用LazyColumn Compose,但在有很多通知的情况下速度非常慢.

Probably it caused by taking long time to load drawable from Notification LargeIcon.
I want to load it asynchronously but I have no idea how should I do it in compose.

以下是LazyList项的部分代码.

@Composable
fun ListElement(notify: Notification) {
    val drawableState = remember {mutableStateOf<Drawable?>(null)}
    Row(modifier=Modifier.height(80.dp).fillMaxWidth().padding(start=10.dp, top=2.dp, bottom=0.dp, end=10.dp), horizontalArrangement = Arrangement.SpaceBetween) {
        Column {
            Text(
                notify.extras.getString(Notification.EXTRA_TITLE, ""),
                style = MaterialTheme.typography.titleMedium
            )
            Text(notify.extras.getString(Notification.EXTRA_TEXT, ""))
        }
        val icon = notify.getLargeIcon()
        if (icon != null) {
            icon.loadDrawableAsync(context=LocalContext.current, listener=(Icon.OnDrawableLoadedListener { d -> drawableState.value = d }), handler= Handler())
    // I have no idea how to load asynchronously...
            if (drawableState.value != null) {
                val bitmap = drawableState.value!!.toBitmap()
                Spacer(modifier = Modifier.height(10.dp))
                Image(
                    bitmap = bitmap.asImageBitmap(),
                    contentDescription = "Icon",
                    modifier = Modifier.fillMaxHeight()
                )
            }
        }}
}

推荐答案

最好不要重新发明轮子,而是使用100或Fresco等库来处理异步图像加载.

下面是一个如何使用Coil从LazyColumn中的Icon异步加载可绘制内容的示例.这将在加载图像时显示占位符图标,然后在图像可用时用加载的图像替换占位符.

LazyColumn {
    items(data) { item ->
        val icon = Icon(item.icon)
        val painter = rememberImagePainter(item.imageUrl)

        Image(
            painter = painter,
            contentDescription = null
        ) {
            if (painter.isLoading) {
                Icon(icon)
            } else {
                it()
            }
        }
 }

不要忘记导入此库:

io.coil-kt:coil-compose:2.5.0"

Android相关问答推荐

Android可组合继承?

fillMaxHeight中的分数在列内不起作用(android jetpack compose)

在命令行Android应用程序开发中苦苦挣扎

穿戴与iPhone连接的安卓操作系统

Android系统应用程序启用编程以太网网络共享

我无法在底部导航栏中正确导航-Android底部导航视图

我们可以使用KSP读取类中变量的值吗?

找不到com.android.tools.build:gradle:8.0

如何在android库中关联应用程序链接?

Hilt+Worker NoSuchMethodException:<;init>;[class android.content.Context,class androidx.work.WorkerParameters]

Jetpack Compose:如何将文本放置在行的右侧?

闪屏 API 无法在 Android 12 上运行(API 31、32)

判断 AAR 元数据时发现 Android 问题:androidx.core:core:1.12.0-alpha01 和 androidx.core:core-ktx:1.12.0-alpha01

在 Jetpack Compose 中使用 ViewModel 实现 startActivity 的最佳实践

在 Jetpack Compose 中使用 .observeAsState() 时,如何在更改 MutableLiveData 的值后开始执行一段代码?

可组合的可见性不随状态变化而变化

try 使用 ViewPager2 实现滑动视图时出现类型不匹配错误

单击登录按钮后从应用程序中退出

在 Room 中创建一对多关系时,@Relation 类是什么意思?

为什么我不能在屏幕外拿任何物体