【发布时间】:2015-11-08 17:15:22
【问题描述】:
我有一个以通常方式实现的 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() 调用”事件,并且两者都在主线程上。
我假设 onMapReady() 之类的回调是通过创建一个工作线程来实现的,该线程完成必要的工作,然后调用主线程的 Handler 将回调(例如 onMapReady())添加到主线程的 MessageQueue .另外,当我从主线程调用 wait() 时,主线程的 looper 将借此机会从其队列中执行另一个项目。
但显然我错了:-)。
底线:如何在 onMapReady() 执行之前阻止?
谢谢, 巴里
附:以上是我的代码的简化版本。实现 OnMapReadyCallback(以及因此的 onMapReady() 回调)的包含类实际上是一个单例。使用 Instance() 方法创建实例,随后通过单独的 getInstance() 方法获取该实例。一旦这工作正常,我将调用 waitForGoogleMap() 到 getInstance() 方法中。这样,应用程序在绝对需要之前不会阻塞。
【问题讨论】:
标签: android google-maps google-maps-android-api-2