在新线程上放置标记

问题描述:

我有一个包含LatLng作为其中一个属性的我的CustomClass约2000个元素的列表。所以基本上我想放弃地图上的所有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); 
    } 
} 

这上面的作品代码执行每次地图移动或zoommed但我的地图仍然laggy。会发生什么情况是地图移动时,for循环遍历2000个元素,并且循环需要几秒钟来处理。发生这种情况时,地图冻结,我无法移动地图或放大/缩小。

我应该将for循环放入异步线程吗?任何示例代码将不胜感激。

我想你可以使用异步机制(的AsyncTask /线程/ 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);