Skip to content

Use MarkerCache for cluster markers #603

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,13 @@ public MarkerManager getMarkerManager() {
return mMarkerManager;
}

public void setRenderer(ClusterRenderer<T> view) {
public void setRenderer(ClusterRenderer<T> renderer) {
mRenderer.setOnClusterClickListener(null);
mRenderer.setOnClusterItemClickListener(null);
mClusterMarkers.clear();
mMarkers.clear();
mRenderer.onRemove();
mRenderer = view;
mRenderer = renderer;
mRenderer.onAdd();
mRenderer.setOnClusterClickListener(mOnClusterClickListener);
mRenderer.setOnClusterInfoWindowClickListener(mOnClusterInfoWindowClickListener);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,12 @@ public class DefaultClusterRenderer<T extends ClusterItem> implements ClusterRen
/**
* Icons for each bucket.
*/
private SparseArray<BitmapDescriptor> mIcons = new SparseArray<BitmapDescriptor>();
private SparseArray<BitmapDescriptor> mIcons = new SparseArray<>();

/**
* Markers for single ClusterItems.
*/
private MarkerCache<T> mMarkerCache = new MarkerCache<T>();
private MarkerCache<T> mMarkerCache = new MarkerCache<>();

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

/**
* Lookup between markers and the associated cluster.
* Markers for Clusters.
*/
private Map<Marker, Cluster<T>> mMarkerToCluster = new HashMap<Marker, Cluster<T>>();
private Map<Cluster<T>, Marker> mClusterToMarker = new HashMap<Cluster<T>, Marker>();
private MarkerCache<Cluster<T>> mClusterMarkerCache = new MarkerCache<>();

/**
* The target zoom level for the current set of clusters.
Expand Down Expand Up @@ -160,15 +159,15 @@ public void onInfoWindowClick(Marker marker) {
mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
return mClickListener != null && mClickListener.onClusterClick(mMarkerToCluster.get(marker));
return mClickListener != null && mClickListener.onClusterClick(mClusterMarkerCache.get(marker));
}
});

mClusterManager.getClusterMarkerCollection().setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
if (mInfoWindowClickListener != null) {
mInfoWindowClickListener.onClusterInfoWindowClick(mMarkerToCluster.get(marker));
mInfoWindowClickListener.onClusterInfoWindowClick(mClusterMarkerCache.get(marker));
}
}
});
Expand Down Expand Up @@ -216,7 +215,7 @@ protected String getClusterText(int bucket) {
if (bucket < BUCKETS[0]) {
return String.valueOf(bucket);
}
return String.valueOf(bucket) + "+";
return bucket + "+";
}

/**
Expand Down Expand Up @@ -389,7 +388,7 @@ public void run() {
// markers to animate from.
List<Point> existingClustersOnScreen = null;
if (DefaultClusterRenderer.this.mClusters != null && mAnimate) {
existingClustersOnScreen = new ArrayList<Point>();
existingClustersOnScreen = new ArrayList<>();
for (Cluster<T> c : DefaultClusterRenderer.this.mClusters) {
if (shouldRenderAsCluster(c) && visibleBounds.contains(c.getPosition())) {
Point point = mSphericalMercatorProjection.toPoint(c.getPosition());
Expand Down Expand Up @@ -428,7 +427,7 @@ public void run() {
// markers to animate from.
List<Point> newClustersOnScreen = null;
if (mAnimate) {
newClustersOnScreen = new ArrayList<Point>();
newClustersOnScreen = new ArrayList<>();
for (Cluster<T> c : clusters) {
if (shouldRenderAsCluster(c) && visibleBounds.contains(c.getPosition())) {
Point p = mSphericalMercatorProjection.toPoint(c.getPosition());
Expand Down Expand Up @@ -528,11 +527,11 @@ private class MarkerModifier extends Handler implements MessageQueue.IdleHandler
private final Lock lock = new ReentrantLock();
private final Condition busyCondition = lock.newCondition();

private Queue<CreateMarkerTask> mCreateMarkerTasks = new LinkedList<CreateMarkerTask>();
private Queue<CreateMarkerTask> mOnScreenCreateMarkerTasks = new LinkedList<CreateMarkerTask>();
private Queue<Marker> mRemoveMarkerTasks = new LinkedList<Marker>();
private Queue<Marker> mOnScreenRemoveMarkerTasks = new LinkedList<Marker>();
private Queue<AnimationTask> mAnimationTasks = new LinkedList<AnimationTask>();
private Queue<CreateMarkerTask> mCreateMarkerTasks = new LinkedList<>();
private Queue<CreateMarkerTask> mOnScreenCreateMarkerTasks = new LinkedList<>();
private Queue<Marker> mRemoveMarkerTasks = new LinkedList<>();
private Queue<Marker> mOnScreenRemoveMarkerTasks = new LinkedList<>();
private Queue<AnimationTask> mAnimationTasks = new LinkedList<>();

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

private void removeMarker(Marker m) {
Cluster<T> cluster = mMarkerToCluster.get(m);
mClusterToMarker.remove(cluster);
mMarkerCache.remove(m);
mMarkerToCluster.remove(m);
mClusterMarkerCache.remove(m);
mClusterManager.getMarkerManager().remove(m);
}

Expand Down Expand Up @@ -715,8 +712,8 @@ public boolean queueIdle() {
* A cache of markers representing individual ClusterItems.
*/
private static class MarkerCache<T> {
private Map<T, Marker> mCache = new HashMap<T, Marker>();
private Map<Marker, T> mCacheReverse = new HashMap<Marker, T>();
private Map<T, Marker> mCache = new HashMap<>();
private Map<Marker, T> mCacheReverse = new HashMap<>();

public Marker get(T item) {
return mCache.get(item);
Expand Down Expand Up @@ -799,7 +796,7 @@ public T getClusterItem(Marker marker) {
* @return a marker from a cluster or null if it does not exists
*/
public Marker getMarker(Cluster<T> cluster) {
return mClusterToMarker.get(cluster);
return mClusterMarkerCache.get(cluster);
}

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

/**
Expand Down Expand Up @@ -869,15 +866,14 @@ private void perform(MarkerModifier markerModifier) {
return;
}

Marker marker = mClusterToMarker.get(cluster);
Marker marker = mClusterMarkerCache.get(cluster);
MarkerWithPosition markerWithPosition;
if (marker == null) {
MarkerOptions markerOptions = new MarkerOptions().
position(animateFrom == null ? cluster.getPosition() : animateFrom);
onBeforeClusterRendered(cluster, markerOptions);
marker = mClusterManager.getClusterMarkerCollection().addMarker(markerOptions);
mMarkerToCluster.put(marker, cluster);
mClusterToMarker.put(cluster, marker);
mClusterMarkerCache.put(cluster, marker);
markerWithPosition = new MarkerWithPosition(marker);
if (animateFrom != null) {
markerModifier.animate(markerWithPosition, animateFrom, cluster.getPosition());
Expand Down Expand Up @@ -950,10 +946,8 @@ public void perform() {
@Override
public void onAnimationEnd(Animator animation) {
if (mRemoveOnComplete) {
Cluster<T> cluster = mMarkerToCluster.get(marker);
mClusterToMarker.remove(cluster);
mMarkerCache.remove(marker);
mMarkerToCluster.remove(marker);
mClusterMarkerCache.remove(marker);
mMarkerManager.remove(marker);
}
markerWithPosition.position = to;
Expand Down