为简化问题,我将参考Google Maps Utils library demo project - custom marker clustering activity
(链接直接指向代码)第69行的注释说明了一切://注意:此方法在UI线程上运行。不要在这里花太多时间(例如在此示例中)。
我的项目的渲染有些沉重,并且在处理地图时会产生一些滞后。我尝试将代码移至AsyncTask,但随后仅呈现默认标记。
我尝试将代码移至onClusterRendered(),但地图响应速度甚至更慢。我想我可以将很多可能性预渲染到群集中,但这并不像是最好的方法
我正在尝试找出正确的方法来使此过程顺利进行。代码会更好]
旧问题,但遇到同样问题时我来到这里。
我认为问题是onBeforeClusterRendered
的markerOptions
参数是在渲染期间/之后被丢弃的局部变量。
相反,只要引用cluster
参数,您就可以在加载图标后调用getMarker(cluster)
,这将返回标记(如果仍然存在)或null
。然后您可以使用marker.setIcon(...)
。
为了避免暂时看到默认标记,您可以隐藏标记,直到图标被加载。
这对我来说很好,并且在加载图标时使地图/ UI保持响应。
@Override
protected void onBeforeClusterRendered(Cluster<Person> cluster, MarkerOptions markerOptions) {
// Hide default marker, load icon on background thread and unhide.
markerOptions.visible(false);
new LoadClusterMarkersAsync(cluster).execute();
}
private class LoadClusterMarkersAsync extends AsyncTask<Void, Void, Void> {
private Cluster<Person> cluster;
public LoadClusterMarkersAsync(Cluster<Person> cluster) {
super();
this.cluster = cluster;
}
@Override
protected Void doInBackground(Void... v) {
// Load icon...
return null;
}
@Override
protected void onPostExecute(Void v) {
super.onPostExecute(v);
Marker marker = getMarker(cluster);
if (marker != null) {
marker.setIcon(...);
marker.setVisible(true);
}
}
}