我尝试了ClusterManager<?> .getMarkerCollection().getMarkers()方法,但它返回空集合.
我在我的应用中使用Google Maps Utility Library.每次屏幕旋转后,我都会创建AsynkTask并在后台线程中从DB读取数据并将项目添加到ClusterManager:
cursor.moveToFirst(); while (!cursor.isAfterLast()) { SomeData row = readSomeDataRow(cursor); clusterManager.addItem(new ClusterItemImpl(row)); cursor.moveToNext(); }
当AsyncTask完成其工作(即在主线程中)时,我试图从ClusterManager获取所有标记:
clusterManager.cluster(); // cluster manager returns empty collection \|/ markers = clusterManager.getMarkerCollection().getMarkers();
但ClusterManager返回空集合.
可能正好在我调用getMarkers()的时候,ClusterManager还没有在地图上放置标记,稍后会这样做(可能在后台线程中).如果是这样,那我怎么能抓住那一刻呢?
解决方法
背景:让我们首先看一下库代码中ClusterManager.addItem的实现:
public void addItem(T myItem) { this.mAlgorithmLock.writeLock().lock(); try { this.mAlgorithm.addItem(myItem); } finally { this.mAlgorithmLock.writeLock().unlock(); } }
如您所见,当您调用clusterManager.addItem时,ClusterManager会调用this.mAlgorithm.addItem. mAlgorithm是存储项目的地方.现在让我们看一下ClusterManager的默认构造函数:
public ClusterManager(Context context,GoogleMap map,MarkerManager markerManager) { ... this.mAlgorithm = new PreCachingAlgorithmDecorator(new NonHierarchicalDistanceBasedAlgorithm()); ... }
mAlgorithm被实例化为包含NonHierarchicalDistanceBasedAlgorithm的PreCachingAlgorithmDecorator.不幸的是,由于mAlgorithm被声明为私有,我们无权访问正在添加到算法中的项目.但是,很高兴有一个简单的解决方法!我们只是使用ClusterManager.setAlgorithm实例化mAlgorithm.这允许我们访问算法类.
>将此声明与您的类变量一起使用:
private Algorithm<Post> clusterManagerAlgorithm;
>在实例化ClusterManager的位置,之后立即放置:
// Instantiate the cluster manager algorithm as is done in the ClusterManager clusterManagerAlgorithm = new NonHierarchicalDistanceBasedAlgorithm(); // Set this local algorithm in clusterManager clusterManager.setAlgorithm(clusterManagerAlgorithm);
>您可以保留用于将项目插入群集的代码完全相同.
>如果要访问插入的项目,只需使用算法而不是ClusterManager:
Collection<ClusterItemImpl> items = clusterManagerAlgorithm.getItems();
这将返回项目而不是Marker对象,但我相信这正是您所需要的.