首页 > 解决方案 > 撰写 w Google 地图:协程中的 mapView.getMapAsync 与 mapView.awaitMap

问题描述

在 Crane jetpack 组合示例中,他们使用记住的协程更新 AndroidView 中的 MapView。

val coroutineScope = rememberCoroutineScope()

AndroidView({ map }) { mapView ->
    coroutineScope.launch {
        val googleMap = mapView.awaitMap()
        // ...
    }
}

作为练习,我删除了协程,而是使用旧的getMapAsync

AndroidView({ map }) { mapView ->
    mapView.getMapAsync { googleMap ->
        // ...
    }
}

似乎以相同的性能正常运行,它还稍微简化了代码(不再需要记住协程,并且可以说在新旧上下文之间进行的脑力体操更少)。

这样做有隐藏成本吗?

标签: android-jetpack-compose

解决方案


我相信我已经想通了。

awaitMap使用协程上下文一样,如果它的组合变得无效,它可以被停止/放弃。

相比之下getMapAsync,是一个带有回调的简单异步操作。如果仍在获取地图时合成变得无效,则操作仍将继续并触发回调。如果您的回调对组合树的状态、可空引用等做出假设,这可能会导致崩溃,因此不应使用。


推荐阅读