我有一个以通常方式实现的 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/