方案
所以基本上我做的是:
的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))
);
预期的行为::每次用户滚动或缩放时,相机位置都会更改,并且再次调用异步任务以获得一批新的活动坐标
实际行为:onPostExecute
和OnCameraChangeListener
之间的无限循环。
从我看来,但也许我错了,addMarker
会触发相机更改事件?如何实现上述预期行为?
答案 0 :(得分:4)
从我看来,但也许我错了,addMarker会触发相机更改事件?
不,它没有。您可能希望为其他人添加完整代码以尝试解决此难题。
预期的行为::每次用户滚动或缩放时,摄像机位置都会改变,异步任务会再次被调用以获得一批新的活动坐标
为什么每次用户更改相机位置时都想获取相同的数据?
改善用户体验的一些注意事项:
Activity
上下文之外保持Web服务通信,以获得无内存漏洞的解决方案。如果您将MyTask
作为Activity
内的内部类,则会在内存中将其保留为Activity
,直到任务完成。clear()
。就像CommonsWare正确建议的那样:IPC越少越好。为此,我可以建议Android Maps Extensions。即使您不使用标记聚类,它也可以选择动态添加标记,因此您无需自己编写标记。答案 1 :(得分:1)
如何实现上述预期行为?
首先,如果数据与上一个任务不同,则仅调用MyTask
。如果没有实际的摄像机更改,则坐标应与上一个任务相同,并且您无需再次点击服务器。
其次,只添加地图上尚未存在的标记(并且不删除已经删除的标记)。即使上一步没有解决的微妙的相机更改,这些更改也不太可能导致标记的阵容发生变化。我认为你当前的逻辑是吹走所有标记并重新加载所有标记,并且这不是特别有效,无论这种相机改变行为如何。几乎所有对GoogleMap
的调用都涉及IPC,因此您希望尽可能少地使用IPC。