【发布时间】:2016-09-28 09:24:28
【问题描述】:
我在我的应用程序中使用 Google 地图及其集群实用程序。集群本身工作正常,但是当我尝试处理配置更改时遇到了问题。
这是我的情况:
- 用户在屏幕上看到一张地图,即
fragment。 - 完成聚类后,地图上会出现标记。用户可以与
markers互动。 - 当用户选择
marker时,它会突出显示,BottomSheet会展开显示。
如果用户旋转屏幕(即发生配置更改),我会保存使用 onSaveInstanceState 选择的标记(实际上我不保存标记本身,而只保存指向相关 List 条目的链接,如 ID)。然后,我想恢复配置更改之前的用户选择。
集群本身是这样执行的:
clusterManager.clearItems();
clusterManager.addItems(eventManager.getEventList());
clusterManager.cluster();
当从服务器接收到数据时执行此代码。执行集群时,所有markers 显然也会重新创建。所以为了突出以前的用户选择(以前的marker),我必须知道集群实用程序何时完成它的操作。到那时,我确信我可以安全地使用以下功能:
clusterManager.getRenderer()).getMarker(<param>)
和
clusterManager.getRenderer()).getClusterItem(<param>)
否则,如果集群任务尚未完成,这些有时会返回null。
但是,我找不到合理的方法,即在集群完成后如何从集群实用程序(即ClusterManager)获得响应。我想我需要更新这个标准的聚类代码:
/**
* Runs the clustering algorithm in a background thread, then re-paints when results come back.
*/
private class ClusterTask extends AsyncTask<Float, Void, Set<? extends Cluster<T>>> {
@Override
protected Set<? extends Cluster<T>> doInBackground(Float... zoom) {
mAlgorithmLock.readLock().lock();
try {
return mAlgorithm.getClusters(zoom[0]);
} finally {
mAlgorithmLock.readLock().unlock();
}
}
@Override
protected void onPostExecute(Set<? extends Cluster<T>> clusters) {
mRenderer.onClustersChanged(clusters);
}
}
我认为,onPostExecute 不应该只向Renderer 提供响应,而是应该向ClusterManager 的用户(如我的fragment)提供集群已完成的响应。但我不想修改标准代码。
有没有更好的方法来处理这种情况?
【问题讨论】:
-
您是否尝试过使用
OnMapLoadedCallback?根据文档 (developers.google.com/android/reference/com/google/android/gms/…),当地图完成渲染时会调用onMapLoaded() -
嗯,可能没问题,但问题是我可以在从服务器接收到数据后立即绘制标记和集群,但有时在接收到数据之前加载地图(由于连接问题等) )。所以这可能行不通。
-
你有什么方法可以监听集群完成事件吗?
标签: android google-maps google-maps-android-api-2 markerclusterer