3

设想

  • 读取初始用户位置并添加标记 + 将相机位置设置为该位置。
  • 每次用户拖动/缩放相机时,我都需要调用 Web 服务并传递地图的矩形坐标。此 Web 服务返回一个位置列表,这些位置将显示为地图范围内的标记。

所以基本上我正在做类似的事情:

创建

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
        // Make a web call for the locations
        myTask = new MyTask();
        myTask.execute();
}

关于从我创建的 Web 服务返回的每个项目的onPostExecute任务:

mMap.addMarker(
    new MarkerOptions().position(
        new LatLng(myPoint.getLatitude(), myPoint.getLongitude())
    )
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_pushpin))
);

预期的行为::每次用户滚动或缩放时,相机位置都会发生变化,并且再次调用异步任务以获取一批新的活动坐标

实际行为: 和 之间的onPostExecute无限循环OnCameraChangeListener

在我看来,但也许我错了,addMarker触发相机更换事件?我怎样才能做出上述预期的行为?

4

2 回答 2

4

在我看来,但也许我错了, addMarker 触发了相机更改事件?

不,它没有。您可能想为其他人添加完整的代码来尝试解决这个难题。

预期的行为:: 每次用户滚动或缩放时,相机位置都会发生变化,并且再次调用异步任务以获取一批新的活动坐标

为什么每次用户更改相机位置时都想获取相同的数据?

改善用户体验的一些注意事项:

  • 只获取一次所有数据并将它们存储到 SQLite DB 中。当然,如果数据发生变化,您需要同步它们,这可能需要稍微更改 Web 服务。不要在简单的用户界面更改上下载所有内容。
  • 将 Web 服务通信保持在Activity上下文之外,以实现无内存泄漏的解决方案。如果你有你MyTask的内部类Activity,这将Activity在内存中销毁,直到任务完成。
  • 仅在可见区域中添加标记,如果已添加则不删除它们。clear()标记的数量会不断增加,但它比每次用户移动地图时都调用要好。就像 CommonsWare 正确建议的那样:IPC 越少越好。为此,我可以建议Android Maps Extensions。即使您不使用标记聚类,它也可以选择动态添加标记,因此您无需自己编写。
于 2013-05-13T22:20:53.523 回答
1

我怎样才能做出上述预期的行为?

MyTask首先,仅当数据与前一个任务不同时才调用。如果没有实际的相机变化,那么坐标应该和你上一个任务一样,你不需要再次打服务器。

其次,仅添加地图上尚未出现的标记(就此而言,不要删除已删除的标记)。即使存在上一步未解决的细微相机变化,这些变化也不太可能导致标记阵容发生变化。我认为您当前的逻辑是吹走所有标记并重新加载它们,这并不是特别有效,无论这种相机更换行为如何。几乎任何电话都GoogleMap涉及 IPC,因此您希望尽可能少地使用这些电话。

于 2013-05-13T21:55:42.367 回答