Fixed another bug reported by users (division by zero).

The issue was most likely related to a race condition (selectedTrackId can change in the UI thread, while the track is being processed in the handler thread).

Simulated slow drawing by adding 50ms, works pretty cool :)
This commit is contained in:
Bartlomiej Niechwiej
2010-11-06 00:31:52 -07:00
parent f5c2467d01
commit 67a0382942
@@ -1023,15 +1023,16 @@ public class MyTracksMap extends MapActivity
loadSelectedTrack();
return;
}
// Keep a copy of selectedTrackId, because it can change asynchronously.
long currentSelectedTrackId = selectedTrackId;
long lastStoredLocationId =
providerUtils.getLastLocationId(selectedTrackId);
providerUtils.getLastLocationId(currentSelectedTrackId);
int samplingFrequency = -1;
Location location = new Location("");
for (;;) {
while (currentSelectedTrackId == selectedTrackId) {
Cursor cursor = null;
try {
cursor = providerUtils.getLocationsCursor(selectedTrackId,
cursor = providerUtils.getLocationsCursor(currentSelectedTrackId,
lastSeenLocationId + 1, TRACKPOINT_BUFFER_SIZE, false);
if (cursor == null || !cursor.moveToFirst()) {
// No (more) data
@@ -1053,6 +1054,14 @@ public class MyTracksMap extends MapActivity
long numTotalPoints = lastStoredLocationId - firstSeenLocationId;
samplingFrequency = (int) (1 + numTotalPoints
/ MyTracksConstants.TARGET_DISPLAYED_TRACK_POINTS);
// TODO: This shouldn't happen after adding currentSelectedTrackId,
// but just to be safe until we have 100% confidence.
if (samplingFrequency <= 0) {
Log.w(MyTracksConstants.TAG,
"readAllNewTrackPoints: samplingFreq <= 0, numTotalPoints = "
+ numTotalPoints + ", trackId = " + currentSelectedTrackId);
samplingFrequency = 1;
}
}
providerUtils.fillLocation(cursor, location);
@@ -1069,7 +1078,8 @@ public class MyTracksMap extends MapActivity
}
numPoints++;
} while (cursor.moveToNext());
} while (cursor.moveToNext() &&
currentSelectedTrackId == selectedTrackId);
} finally {
if (cursor != null) {
cursor.close();