From b0713cc0e7bd17261475a6b6f8e85ba827823e26 Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Mon, 3 Dec 2012 10:17:33 -0800 Subject: [PATCH] Add synchronization when accessing waypoints in ChartView --- .../android/apps/mytracks/ChartView.java | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/MyTracks/src/com/google/android/apps/mytracks/ChartView.java b/MyTracks/src/com/google/android/apps/mytracks/ChartView.java index 44b30e677..165a20327 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/ChartView.java +++ b/MyTracks/src/com/google/android/apps/mytracks/ChartView.java @@ -309,14 +309,18 @@ public class ChartView extends View { * @param waypoint the waypoint */ public void addWaypoint(Waypoint waypoint) { - waypoints.add(waypoint); + synchronized (waypoints) { + waypoints.add(waypoint); + } } /** * Clears the waypoints. */ public void clearWaypoints() { - waypoints.clear(); + synchronized (waypoints) { + waypoints.clear(); + } } /** @@ -445,13 +449,15 @@ public class ChartView extends View { if (Math.abs(event.getY() - topBorder - spacer - markerHeight / 2) < markerHeight) { int minDistance = Integer.MAX_VALUE; Waypoint nearestWaypoint = null; - for (int i = 0; i < waypoints.size(); i++) { - Waypoint waypoint = waypoints.get(i); - int distance = Math.abs( - getX(getWaypointXValue(waypoint)) - (int) event.getX() - getScrollX()); - if (distance < minDistance) { - minDistance = distance; - nearestWaypoint = waypoint; + synchronized (waypoints) { + for (int i = 0; i < waypoints.size(); i++) { + Waypoint waypoint = waypoints.get(i); + int distance = Math.abs( + getX(getWaypointXValue(waypoint)) - (int) event.getX() - getScrollX()); + if (distance < minDistance) { + minDistance = distance; + nearestWaypoint = waypoint; + } } } if (nearestWaypoint != null && minDistance < markerWidth) { @@ -543,27 +549,29 @@ public class ChartView extends View { * @param canvas the canvas */ private void drawWaypoints(Canvas canvas) { - for (int i = 0; i < waypoints.size(); i++) { - final Waypoint waypoint = waypoints.get(i); - if (waypoint.getLocation() == null) { - continue; + synchronized (waypoints) { + for (int i = 0; i < waypoints.size(); i++) { + final Waypoint waypoint = waypoints.get(i); + if (waypoint.getLocation() == null) { + continue; + } + double xValue = getWaypointXValue(waypoint); + if (xValue > maxX) { + continue; + } + canvas.save(); + float x = getX(getWaypointXValue(waypoint)); + canvas.drawLine( + x, topBorder + spacer + markerHeight / 2, x, topBorder + effectiveHeight, markerPaint); + canvas.translate( + x - (float) (markerWidth * MapOverlay.WAYPOINT_X_ANCHOR), topBorder + spacer); + if (waypoints.get(i).getType() == Waypoint.TYPE_STATISTICS) { + statisticsMarker.draw(canvas); + } else { + waypointMarker.draw(canvas); + } + canvas.restore(); } - double xValue = getWaypointXValue(waypoint); - if (xValue > maxX) { - continue; - } - canvas.save(); - float x = getX(getWaypointXValue(waypoint)); - canvas.drawLine( - x, topBorder + spacer + markerHeight / 2, x, topBorder + effectiveHeight, markerPaint); - canvas.translate(x - (float) (markerWidth * MapOverlay.WAYPOINT_X_ANCHOR), - topBorder + spacer); - if (waypoints.get(i).getType() == Waypoint.TYPE_STATISTICS) { - statisticsMarker.draw(canvas); - } else { - waypointMarker.draw(canvas); - } - canvas.restore(); } }