android-jetpack-compose - 撰写 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 ->
// ...
}
}
这似乎以相同的性能正常运行,它还稍微简化了代码(不再需要记住协程,并且可以说在新旧上下文之间进行的脑力体操更少)。
这样做有隐藏成本吗?
解决方案
我相信我已经想通了。
与awaitMap
使用协程上下文一样,如果它的组合变得无效,它可以被停止/放弃。
相比之下getMapAsync
,是一个带有回调的简单异步操作。如果仍在获取地图时合成变得无效,则操作仍将继续并触发回调。如果您的回调对组合树的状态、可空引用等做出假设,这可能会导致崩溃,因此不应使用。
推荐阅读
- java - Java 中 byte[] 中的负值,但 Python 中没有
- angular - 使用 Jenkins 在开发或生产中进行 Angular 部署
- wordpress - 两列布局在引导程序中不起作用
- python - 有没有办法使用 folium 在 TimeSliderChoropleth 地图上的特定日期绘制标记?
- c++ - 如何逐步使数组输出?
- java - Java8 Lambda我可以生成新的对象列表吗
- python - 如何在 python 中对 olimpique 种族进行求和
- reactjs - 索引后的 Next.js 动态路由
- java - java.lang.ClassCastException:com.example.demo.Hibernate.AccountEntity 不能转换为 com.example.demo.Hibernate.AccountEntity
- java - 无法在 VS Code Maven 项目中设置 java.home