android – Google Maps Utility:如何从ClusterManager <?>获取所有标记?

对不起我的英语不好

我尝试了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对象,但我相信这正是您所需要的.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...