在新线程上删除标记

时间:2017-11-11 01:50:31

标签: java android google-maps

我有一个大约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循环放在异步线程中吗?任何示例代码将不胜感激。

1 个答案:

答案 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);