我有一个大约2000个CustomClass元素的列表,其中LatLng
作为其中一个属性。所以基本上我想在地图上删除所有2000个标记,但丢弃所有这些标记会使地图变得迟钝。所以我决定为地图实现延迟加载。我有一个HashMap,它包含在可见区域中删除的标记。以下是我实施它的方式。
我遍历我的列表并检查项目的LatLng
坐标是否在可见范围内。我使用LatLngBounds.contains()
方法做到了这一点。如果项目的坐标位于可见区域,则删除标记并将其添加到HashMap。如果项目的坐标不在可见区域,则它不应该在地图上,如果它在那里我将其从地图中删除。
以下代码位于onCameraIdleListener()
,每次移动或放大地图时都会执行
for (Event event: listOfEvents) {
LatLng latLng = event.getCoordinates();
LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
boolean isMarkerOnMap = markerksOnMap.contains(latLng);
if bounds.contains(latLng) {
if (!isMarkerOnMap) {
// add marker
markersOnMap.add(latLng);
}
}
else if (isMarkerOnMap) {
// remove marker
markersOnMap.remove(latLng);
}
}
上面的代码有效但我的地图仍然很滞后。发生的事情是移动地图时,for循环遍历2000个元素,循环处理需要几秒钟。当发生这种情况时,地图会冻结,我无法移动地图或放大/缩小地图。
我应该将for循环放在异步线程中吗?任何示例代码将不胜感激。
答案 0 :(得分:0)
我认为您可以使用异步机制(asynctask / thread / rxjava)来填充所有标记
所以当添加生成的标记 markersOnMap (它发生在主线程中)时,只需删除所有标记并将其替换为异步进程的结果
关于asynctask()的例子:
class GenerateMarkerTask extends AsyncTask(List<Event>, Integer, List<Marker>) {
protected List<Marker> doInBackground(List<Event>... events) {
List<Marker> markers = new ArrayList();
for (Event event: listOfEvents) {
LatLng latLng = event.getCoordinates();
LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
boolean isMarkerOnMap = markerksOnMap.contains(latLng);
if bounds.contains(latLng) {
if (!isMarkerOnMap) {
// add marker
markers.add(latLng);
}
}
}
}
protected void onPostExecute(List<Marker> result) {
markerksOnMap.clear();
for (Marker marker: result) {
markersOnMap.add(result);
}
}
}
然后在onCameraIdleListener()上运行
new GenerateMarkerTask.execute(listOfEvents);