在新线程上放置标记
问题描述:
我有一个包含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);