Google Maps API V2 addMarker和OnCameraChangeListener

时间:2013-05-13 21:42:43

标签: android android-asynctask google-maps-android-api-2

方案

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

所以基本上我做的是:

的onCreate

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

对于从我所做的网络服务返回的每件商品的 onPostExecute 任务:

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

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

实际行为onPostExecuteOnCameraChangeListener之间的无限循环。

从我看来,但也许我错了,addMarker会触发相机更改事件?如何实现上述预期行为?

2 个答案:

答案 0 :(得分:4)

  

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

不,它没有。您可能希望为其他人添加完整代码以尝试解决此难题。

  

预期的行为::每次用户滚动或缩放时,摄像机位置都会改变,异步任务会再次被调用以获得一批新的活动坐标

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

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

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

答案 1 :(得分:1)

  

如何实现上述预期行为?

首先,如果数据与上一个任务不同,则仅调用MyTask。如果没有实际的摄像机更改,则坐标应与上一个任务相同,并且您无需再次点击服务器。

其次,只添加地图上尚未存在的标记(并且不删除已经删除的标记)。即使上一步没有解决的微妙的相机更改,这些更改也不太可能导致标记的阵容发生变化。我认为你当前的逻辑是吹走所有标记并重新加载所有标记,并且这不是特别有效,无论这种相机改变行为如何。几乎所有对GoogleMap的调用都涉及IPC,因此您希望尽可能少地使用IPC。