Skip to content

Commit 1a36ac4

Browse files
authored
refactor(DefaultClusterRenderer): Use MarkerCache for cluster markers (#603)
Use MarkerCache for two-way lookup between Markers and Clusters, same as used for ClusterItem marker cache. MarkerCache encapsulates the logic for managing two HashMaps independently.
1 parent d43841f commit 1a36ac4

File tree

2 files changed

+24
-30
lines changed

2 files changed

+24
-30
lines changed

library/src/main/java/com/google/maps/android/clustering/ClusterManager.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,13 @@ public MarkerManager getMarkerManager() {
9393
return mMarkerManager;
9494
}
9595

96-
public void setRenderer(ClusterRenderer<T> view) {
96+
public void setRenderer(ClusterRenderer<T> renderer) {
9797
mRenderer.setOnClusterClickListener(null);
9898
mRenderer.setOnClusterItemClickListener(null);
9999
mClusterMarkers.clear();
100100
mMarkers.clear();
101101
mRenderer.onRemove();
102-
mRenderer = view;
102+
mRenderer = renderer;
103103
mRenderer.onAdd();
104104
mRenderer.setOnClusterClickListener(mOnClusterClickListener);
105105
mRenderer.setOnClusterInfoWindowClickListener(mOnClusterInfoWindowClickListener);

library/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.java

+22-28
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,12 @@ public class DefaultClusterRenderer<T extends ClusterItem> implements ClusterRen
9393
/**
9494
* Icons for each bucket.
9595
*/
96-
private SparseArray<BitmapDescriptor> mIcons = new SparseArray<BitmapDescriptor>();
96+
private SparseArray<BitmapDescriptor> mIcons = new SparseArray<>();
9797

9898
/**
9999
* Markers for single ClusterItems.
100100
*/
101-
private MarkerCache<T> mMarkerCache = new MarkerCache<T>();
101+
private MarkerCache<T> mMarkerCache = new MarkerCache<>();
102102

103103
/**
104104
* If cluster size is less than this size, display individual markers.
@@ -111,10 +111,9 @@ public class DefaultClusterRenderer<T extends ClusterItem> implements ClusterRen
111111
private Set<? extends Cluster<T>> mClusters;
112112

113113
/**
114-
* Lookup between markers and the associated cluster.
114+
* Markers for Clusters.
115115
*/
116-
private Map<Marker, Cluster<T>> mMarkerToCluster = new HashMap<Marker, Cluster<T>>();
117-
private Map<Cluster<T>, Marker> mClusterToMarker = new HashMap<Cluster<T>, Marker>();
116+
private MarkerCache<Cluster<T>> mClusterMarkerCache = new MarkerCache<>();
118117

119118
/**
120119
* The target zoom level for the current set of clusters.
@@ -160,15 +159,15 @@ public void onInfoWindowClick(Marker marker) {
160159
mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
161160
@Override
162161
public boolean onMarkerClick(Marker marker) {
163-
return mClickListener != null && mClickListener.onClusterClick(mMarkerToCluster.get(marker));
162+
return mClickListener != null && mClickListener.onClusterClick(mClusterMarkerCache.get(marker));
164163
}
165164
});
166165

167166
mClusterManager.getClusterMarkerCollection().setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
168167
@Override
169168
public void onInfoWindowClick(Marker marker) {
170169
if (mInfoWindowClickListener != null) {
171-
mInfoWindowClickListener.onClusterInfoWindowClick(mMarkerToCluster.get(marker));
170+
mInfoWindowClickListener.onClusterInfoWindowClick(mClusterMarkerCache.get(marker));
172171
}
173172
}
174173
});
@@ -216,7 +215,7 @@ protected String getClusterText(int bucket) {
216215
if (bucket < BUCKETS[0]) {
217216
return String.valueOf(bucket);
218217
}
219-
return String.valueOf(bucket) + "+";
218+
return bucket + "+";
220219
}
221220

222221
/**
@@ -389,7 +388,7 @@ public void run() {
389388
// markers to animate from.
390389
List<Point> existingClustersOnScreen = null;
391390
if (DefaultClusterRenderer.this.mClusters != null && mAnimate) {
392-
existingClustersOnScreen = new ArrayList<Point>();
391+
existingClustersOnScreen = new ArrayList<>();
393392
for (Cluster<T> c : DefaultClusterRenderer.this.mClusters) {
394393
if (shouldRenderAsCluster(c) && visibleBounds.contains(c.getPosition())) {
395394
Point point = mSphericalMercatorProjection.toPoint(c.getPosition());
@@ -428,7 +427,7 @@ public void run() {
428427
// markers to animate from.
429428
List<Point> newClustersOnScreen = null;
430429
if (mAnimate) {
431-
newClustersOnScreen = new ArrayList<Point>();
430+
newClustersOnScreen = new ArrayList<>();
432431
for (Cluster<T> c : clusters) {
433432
if (shouldRenderAsCluster(c) && visibleBounds.contains(c.getPosition())) {
434433
Point p = mSphericalMercatorProjection.toPoint(c.getPosition());
@@ -528,11 +527,11 @@ private class MarkerModifier extends Handler implements MessageQueue.IdleHandler
528527
private final Lock lock = new ReentrantLock();
529528
private final Condition busyCondition = lock.newCondition();
530529

531-
private Queue<CreateMarkerTask> mCreateMarkerTasks = new LinkedList<CreateMarkerTask>();
532-
private Queue<CreateMarkerTask> mOnScreenCreateMarkerTasks = new LinkedList<CreateMarkerTask>();
533-
private Queue<Marker> mRemoveMarkerTasks = new LinkedList<Marker>();
534-
private Queue<Marker> mOnScreenRemoveMarkerTasks = new LinkedList<Marker>();
535-
private Queue<AnimationTask> mAnimationTasks = new LinkedList<AnimationTask>();
530+
private Queue<CreateMarkerTask> mCreateMarkerTasks = new LinkedList<>();
531+
private Queue<CreateMarkerTask> mOnScreenCreateMarkerTasks = new LinkedList<>();
532+
private Queue<Marker> mRemoveMarkerTasks = new LinkedList<>();
533+
private Queue<Marker> mOnScreenRemoveMarkerTasks = new LinkedList<>();
534+
private Queue<AnimationTask> mAnimationTasks = new LinkedList<>();
536535

537536
/**
538537
* Whether the idle listener has been added to the UI thread's MessageQueue.
@@ -659,10 +658,8 @@ private void performNextTask() {
659658
}
660659

661660
private void removeMarker(Marker m) {
662-
Cluster<T> cluster = mMarkerToCluster.get(m);
663-
mClusterToMarker.remove(cluster);
664661
mMarkerCache.remove(m);
665-
mMarkerToCluster.remove(m);
662+
mClusterMarkerCache.remove(m);
666663
mClusterManager.getMarkerManager().remove(m);
667664
}
668665

@@ -715,8 +712,8 @@ public boolean queueIdle() {
715712
* A cache of markers representing individual ClusterItems.
716713
*/
717714
private static class MarkerCache<T> {
718-
private Map<T, Marker> mCache = new HashMap<T, Marker>();
719-
private Map<Marker, T> mCacheReverse = new HashMap<Marker, T>();
715+
private Map<T, Marker> mCache = new HashMap<>();
716+
private Map<Marker, T> mCacheReverse = new HashMap<>();
720717

721718
public Marker get(T item) {
722719
return mCache.get(item);
@@ -799,7 +796,7 @@ public T getClusterItem(Marker marker) {
799796
* @return a marker from a cluster or null if it does not exists
800797
*/
801798
public Marker getMarker(Cluster<T> cluster) {
802-
return mClusterToMarker.get(cluster);
799+
return mClusterMarkerCache.get(cluster);
803800
}
804801

805802
/**
@@ -809,7 +806,7 @@ public Marker getMarker(Cluster<T> cluster) {
809806
* @return a Cluster from a marker or null if it does not exists
810807
*/
811808
public Cluster<T> getCluster(Marker marker) {
812-
return mMarkerToCluster.get(marker);
809+
return mClusterMarkerCache.get(marker);
813810
}
814811

815812
/**
@@ -869,15 +866,14 @@ private void perform(MarkerModifier markerModifier) {
869866
return;
870867
}
871868

872-
Marker marker = mClusterToMarker.get(cluster);
869+
Marker marker = mClusterMarkerCache.get(cluster);
873870
MarkerWithPosition markerWithPosition;
874871
if (marker == null) {
875872
MarkerOptions markerOptions = new MarkerOptions().
876873
position(animateFrom == null ? cluster.getPosition() : animateFrom);
877874
onBeforeClusterRendered(cluster, markerOptions);
878875
marker = mClusterManager.getClusterMarkerCollection().addMarker(markerOptions);
879-
mMarkerToCluster.put(marker, cluster);
880-
mClusterToMarker.put(cluster, marker);
876+
mClusterMarkerCache.put(cluster, marker);
881877
markerWithPosition = new MarkerWithPosition(marker);
882878
if (animateFrom != null) {
883879
markerModifier.animate(markerWithPosition, animateFrom, cluster.getPosition());
@@ -950,10 +946,8 @@ public void perform() {
950946
@Override
951947
public void onAnimationEnd(Animator animation) {
952948
if (mRemoveOnComplete) {
953-
Cluster<T> cluster = mMarkerToCluster.get(marker);
954-
mClusterToMarker.remove(cluster);
955949
mMarkerCache.remove(marker);
956-
mMarkerToCluster.remove(marker);
950+
mClusterMarkerCache.remove(marker);
957951
mMarkerManager.remove(marker);
958952
}
959953
markerWithPosition.position = to;

0 commit comments

Comments
 (0)