我有一个以通常方式实现的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()。这样,应用程序就会阻止,直到绝对需要为止。
答案 0 :(得分:2)
我做错了什么?
waitForGoogleMap()
正在onMapReady()
应该调用的同一个线程上运行,因此在onMapReady()
返回之前无法调用waitForGoogleMap()
。
摆脱waitForGoogleMap()
。启动GoogleMap
中需要onMapReady()
的工作。如果需要,可以使用事件总线来获取“嘿,地图准备就绪!”#34;事件转移到其他组件。