【问题标题】:getMapAsync() - call once and save the result, or call every time I need the map?getMapAsync() - 调用一次并保存结果,还是每次需要地图时调用?
【发布时间】:2015-02-10 13:12:03
【问题描述】:

Google Play Services 6.5 添加了getMapAsync 方法,它允许我们异步检索支持MapFragment(或MapView)的GoogleMap 对象。该文档指出

回调提供的 GoogleMap 对象不为空。

我不太了解这里为什么需要异步检索(即,什么情况会导致已弃用的getMap 方法返回null),这导致我提出以下问题:

当使用MapFragment 时,我是否应该在onCreate 中调用一次getMapAsync,存储回调返回的(非空)GoogleMap,然后在我班级的其他任何地方引用这个存储的结果? 或者,我是否应该在每次需要与GoogleMap 对象交互时调用getMapAsync,并在相应的回调中进行所有与地图相关的工作?

第一个选项导致代码更紧凑,所以如果可能的话,我更愿意使用它。我存储的GoogleMap 对象是否存在“过时”或null 的风险(在这种情况下,第二个选项会更安全)?

【问题讨论】:

    标签: android google-maps google-play-services android-maps-v2


    【解决方案1】:

    谷歌地图相关示例,位于目录中

    <path-to-sdk>/extras/google/google_play_services/samples/maps
    

    保留一个参考,所以我相信这应该没问题。

    您必须使用异步调用的原因是(我想),因为地图在初始化时可能会发出网络请求(要下载图块等,请参阅文档以获取更多信息)。如果是这种情况,则需要(部分)在单独的线程上初始化映射。因此,您必须等到初始化完成才能获得GoogleMap

    getMap() 函数可以正确返回 GoogleMap,但不能保证。如果你过早调用getMap()函数,地图还没有被初始化,它会返回null。

    【讨论】:

    • 谢谢,参考样本是个好主意!特别是,CameraDemoActivity 是一个示例 Activity,它在异步检索后存储对 GoogleMap 对象的引用。只是想在评论中添加它以帮助其他人立即找到具体示例。
    • 我可以确认即使有网络连接,旧的 getMap() 函数有时也会返回 null。这种情况很少见,但它确实发生了。新的 getMapAsync() 和 OnMapReady() 函数保证 GoogleMap 不为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多