android - 等待调用 onMapReady()

标签 android google-maps google-maps-android-api-2

我有一个以通常方式实现的 Google map ,调用 MapFragment 的 getMapAsync() 然后等待调用 onMapReady() 以提供 GoogleMap 实例。在我添加代码以等待调用 onMapReady() 以确保 GoogleMap 实例在继续之前可用之前,一切正常。

在 getMapAsync() 返回和 onMapReady() 被调用之间有一小段时间(有道理——否则它不需要异步)。尽管在我的非正式测试中,延迟往往少于半秒,但我想处理延迟可能更长的情况。

考虑到这个目标,我添加了一个简单的等待循环来阻塞名为“map_ready”的变量。 map_ready 最初是假的,它被 onMapReady() 设置为真。 waitForGoogleMap() 方法简单地循环,定期测试变量并仅在变量变为真时返回。这是代码大纲。

    static boolean map_ready = false;

    private void init_gmap_fragment(Activity a) {
        [...]
        MapFragment f_new = new MapFragment();
        [...]
        f_new.getMapAsync(this);
        waitForGoogleMap();
    }

    synchronized private void waitForGoogleMap() {
        while (!map_ready) {
            Log.d(LOGTAG, "Waiting for GoogleMap...");
            try {
                wait(1000);
            } catch (Exception e) { Log.d(LOGTAG, "Exception!"); }
        }
    }

    public void onMapReady(GoogleMap gmap) {
        try {
            this.gmap = gmap;
            map_ready = true;
        }
        [...]
    }

如上所示的代码一遍又一遍地打印出“Waiting for GoogleMap...”——运行 waitForGoogleMap() 似乎阻止了 onMapReady() 被调用。如果我注释掉对 waitForGoogleMap() 的调用,它运行得很好。

我做错了什么?


更新/澄清:我认为我面临的核心问题是我想监听一个预计会与监听器在同一线程上发生的事件。在这种情况下,waitForGoogleMap() 正在等待事件“onMapReady() called”并且两者都在主线程上。

我假设像 onMapReady() 这样的回调是通过创建一个工作线程来实现的,该工作线程执行必要的工作,然后调用主线程的 Handler 将回调(例如,onMapReady())添加到主线程的 MessageQueue .此外,当我从主线程调用 wait() 时,主线程的循环程序将借此机会执行其队列中的另一个项目。

但显然我错了:-)。

底线:如何在 onMapReady() 执行之前阻塞?


谢谢, 巴里

附言以上是我的代码的简化版本。实现 OnMapReadyCallback(以及因此实现 onMapReady() 回调)的包含类实际上是一个单例。实例是使用 Instance() 方法创建的,随后通过单独的 getInstance() 方法获取实例。一旦成功,我将在 getInstance() 方法中调用 waitForGoogleMap() 。这样,除非绝对需要,否则应用程序不会阻塞。

最佳答案

What am I doing wrong?

waitForGoogleMap() 运行在 onMapReady() 应该被调用的同一线程上,因此 onMapReady() 不能被调用直到 waitForGoogleMap() 返回。

摆脱 waitForGoogleMap()。在 onMapReady() 中开始需要 GoogleMap 的工作。如果需要,使用事件总线来获得“嘿, map 准备好了!”事件转移到其他组件。

关于android - 等待调用 onMapReady(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33596678/

相关文章:

javascript - Bootstrap 模式中的 Google map 。平移/缩放鼠标手势不起作用

iphone - 谷歌地图风格 uipopovercontroller

android - 如何在谷歌地图 v2 的默认标记中绘制文本

android - 如何让标记出现在谷歌地图初始窗口的中央?

android - 如何在 Android 模拟器设备中显示 Google map ?

java - Google Directions Api 似乎无法在 Kotlin 中运行

android - 通过代码区分安卓设备 [8inch vs 10 inch tablet]

android - 如何测量 Dalvik JVM 上的类内存大小?

android - 如何确定 View 的当前方向(RTL/LTR)?

java - 我们可以向可绘制对象添加文本吗?