等待onMapReady()被称为

时间:2015-11-08 17:15:23

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

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

getMapAsync()返回和onMapReady()被调用之间有一段很短的时间(有意义 - 否则它不需要是异步的)。虽然,在我的非正式测试中,延迟往往不到半秒,但我想处理延迟可能更长的情况。

考虑到这个目标,我添加了一个简单的等待循环来阻止一个名为" map_ready"的变量。 map_ready最初为false,并由onMapReady()设置为true。 waitForGoogleMap()方法只是循环,定期测试变量并仅在变量变为true时返回。这是代码大纲。

    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;
        }
        [...]
    }

如上所示的代码打印出"等待GoogleMap ..."一遍又一遍 - 似乎运行waitForGoogleMap()会阻止onMapReady()被调用。如果我注释掉对waitForGoogleMap()的调用,它运行就好了。

我做错了什么?

UPDATE / CLARIFICATION :我认为我面临的核心问题是我想要监听一个事件,该事件预计会发生在与侦听器相同的线程上。在这种情况下,waitForGoogleMap()正在等待事件" onMapReady()调用"两者都在主线上。

我假设通过创建一个工作线程来实现回调,例如onMapReady(),该工作线程执行必要的工作,然后调用主线程的处理程序来添加回调(例如,onMapReady())主线程的MessageQueue。另外,当我从主线程调用wait()时,主线程的looper将利用这个机会从队列中排除另一个项目。

但显然我错了: - )。

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

谢谢, 百里

P.S。以上是我的代码的简化版本。实现OnMapReadyCallback(因此onMapReady()回调)的包含类实际上是一个单例。使用Instance()方法创建实例,随后通过单独的getInstance()方法获取实例。一旦这个工作,我将在getInstance()方法中调用waitForGoogleMap()。这样,应用程序就会阻止,直到绝对需要为止。

1 个答案:

答案 0 :(得分:2)

  

我做错了什么?

waitForGoogleMap()正在onMapReady()应该调用的同一个线程上运行,因此在onMapReady()返回之前无法调用waitForGoogleMap()

摆脱waitForGoogleMap()。启动GoogleMap中需要onMapReady()的工作。如果需要,可以使用事件总线来获取“嘿,地图准备就绪!”#34;事件转移到其他组件。