对不起我的英语不好
我尝试了该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 AlgorithmclusterManagerAlgorithm;
在您实例化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:
Collectionitems = clusterManagerAlgorithm.getItems();
这将返回项目而不是Marker对象,但我相信这是您需要的.