From 891005a65e1d11898075b828320a73f4701054e8 Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Wed, 6 Feb 2013 16:53:25 -0800 Subject: [PATCH] Fix memory leak in TrackDetailActivity due to TrackController. --- .../apps/mytracks/TrackController.java | 28 +++++++++++++++---- .../apps/mytracks/TrackDetailActivity.java | 4 +-- .../apps/mytracks/TrackListActivity.java | 4 +-- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackController.java b/MyTracks/src/com/google/android/apps/mytracks/TrackController.java index fd9775c20..c26fb8db1 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackController.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackController.java @@ -48,18 +48,21 @@ public class TrackController { private final TextView totalTimeTextView; private final ImageButton recordImageButton; private final ImageButton stopImageButton; - private final boolean alwaysShow; - + private final boolean alwaysShow; + private boolean isRecording; private boolean isPaused; private long totalTime = 0; + // the timestamp for the toal time private long totalTimeTimestamp = 0; + private boolean isResumed = false; + // A runnable to update the total time. private final Runnable updateTotalTimeRunnable = new Runnable() { public void run() { - if (isRecording && !isPaused) { + if (isResumed && isRecording && !isPaused) { totalTimeTextView.setText(StringUtils.formatElapsedTimeWithHour( System.currentTimeMillis() - totalTimeTimestamp + totalTime)); handler.postDelayed(this, ONE_SECOND); @@ -84,12 +87,15 @@ public class TrackController { } public void update(boolean recording, boolean paused) { + if (!isResumed) { + return; + } isRecording = recording; isPaused = paused; containerView.setVisibility(alwaysShow || isRecording ? View.VISIBLE : View.GONE); if (!alwaysShow && !isRecording) { - stop(); + stopTimer(); return; } @@ -108,7 +114,7 @@ public class TrackController { statusTextView.setText(isPaused ? R.string.generic_paused : R.string.generic_recording); } - stop(); + stopTimer(); totalTime = isRecording ? getTotalTime() : 0L; totalTimeTextView.setText(StringUtils.formatElapsedTimeWithHour(totalTime)); if (isRecording && !isPaused) { @@ -117,10 +123,20 @@ public class TrackController { } } + public void onResume(boolean recording, boolean paused) { + isResumed = true; + update(recording, paused); + } + + public void onPause() { + isResumed = false; + stopTimer(); + } + /** * Stops the timer. */ - public void stop() { + private void stopTimer() { handler.removeCallbacks(updateTotalTimeRunnable); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java index 70d832f5b..3bfb2d2b4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java @@ -234,13 +234,13 @@ public class TrackDetailActivity extends AbstractMyTracksActivity implements Del // Update UI boolean isRecording = trackId == recordingTrackId; updateMenuItems(isRecording, recordingTrackPaused); - trackController.update(isRecording, recordingTrackPaused); + trackController.onResume(isRecording, recordingTrackPaused); } @Override protected void onPause() { super.onPause(); - trackController.stop(); + trackController.onPause(); } @Override diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java index 8c8c30c7d..6883cf81e 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java @@ -463,7 +463,7 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; updateMenuItems(isRecording); sectionResourceCursorAdapter.notifyDataSetChanged(); - trackController.update(isRecording, recordingTrackPaused); + trackController.onResume(isRecording, recordingTrackPaused); } @Override @@ -474,7 +474,7 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac trackDataHub.unregisterTrackDataListener(trackDataListener); // Update UI - trackController.stop(); + trackController.onPause(); } @Override