3

我仍然不相信我在 SO 上找不到任何问题,所以请随时指出我的问题。

我正在使用显示多个标记的谷歌地图实现应用程序。我想让它动态化,以便只绘制看到的标记。为此,我希望能够知道地图何时完全停止,然后等待几秒钟,这样我就不会在用户可能仍在移动地图时弄乱地图,然后清除标记并绘制新标记。如果用户在计时器触发之前移动,它必须取消然后再次开始计数。

到目前为止,当动画停止使用时,我设法让相机更改触发onCameraChangeListener,尽管它的定义指定这可能仍会在动画中间调用。这是正确的方法吗?

第二个问题是关于计时器的。我目前的实现如下:

map.setOnCameraChangeListener(new OnCameraChangeListener() {
    public void onCameraChange(CameraPosition position) {
        refresher.schedule(new refreshMapData(), 2000);
    }
});

实际更新必要标记的 Timer 是这个:

class refreshMapData extends TimerTask{

    public void run() {
        map.clear();
        for ( ... ) {
            map.addMarker( ... );
        }
    }
}

这显然会引发“不在主线程上”异常并引导我进入下一个问题:这个问题的解决方法是什么?如果不允许从主线程外部进行修改,如何使用计时器修改 Google Map 的值?

编辑:关于第一个问题,我想我只需要比较自上次以来位置是否发生变化,这样就可以了。只需要计时器更新问题的答案。

4

2 回答 2

4

你最好使用Handler. 这不会创建额外的线程,这是不必要的。

只需在 onCameraChange 中调用它:

handler.removeMessages(MSG_ID);
handler.sendEmptyMessageDelayed(MSG_ID, 2000);

并在handleMessage中完成您的工作。

如果只显示几个标记,为什么需要它是动态的?可见区域之外的标记不制作要慢得多。您清除和添加标记的代码可能会使其变慢。

如果您要显示数千个标记,请尝试Android Maps Extensions,它只添加了内置的可见标记。

于 2013-04-14T14:53:56.783 回答
0

我不知道您是否仍然需要一个好的解决方案,但我发现了这个问题并认为可能会有所帮助。这对我有帮助,这家伙写了一篇博文,解释如何使用集群管理器以及如何设置。

于 2015-05-18T22:06:26.710 回答