summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWu-cheng Li <wuchengli@google.com>2012-04-03 19:08:35 +0800
committerWu-cheng Li <wuchengli@google.com>2012-04-03 20:13:48 +0800
commit3957efd020f2e80d79cd3fed019f2883668a1c9e (patch)
tree690c04aa210c2501fa3a035ac159d3f347f36737 /src
parent98c2490a424da79beefbdd8a29fb90ab006c77b0 (diff)
downloadandroid_packages_apps_Gallery2-3957efd020f2e80d79cd3fed019f2883668a1c9e.tar.gz
android_packages_apps_Gallery2-3957efd020f2e80d79cd3fed019f2883668a1c9e.tar.bz2
android_packages_apps_Gallery2-3957efd020f2e80d79cd3fed019f2883668a1c9e.zip
Fix OOM when switching between camera and camcorder.
- Camera activities extend AbstractGalleryActivity. So onDestroy is moved from Gallery to AbstractGalleryActivity. - Use WeakReference for values in the WeakHashMap of SpinnerVisibilitySetter. bug:5954389 Change-Id: Ib15f269bd4c54a4621bdff58e7ea16b44f8fb3e3
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/app/AbstractGalleryActivity.java11
-rw-r--r--src/com/android/gallery3d/app/Gallery.java12
-rw-r--r--src/com/android/gallery3d/util/SpinnerVisibilitySetter.java14
3 files changed, 21 insertions, 16 deletions
diff --git a/src/com/android/gallery3d/app/AbstractGalleryActivity.java b/src/com/android/gallery3d/app/AbstractGalleryActivity.java
index 9a1d3d300..899e9bfa4 100644
--- a/src/com/android/gallery3d/app/AbstractGalleryActivity.java
+++ b/src/com/android/gallery3d/app/AbstractGalleryActivity.java
@@ -181,6 +181,17 @@ public class AbstractGalleryActivity extends Activity implements GalleryActivity
}
@Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mGLRootView.lockRenderThread();
+ try {
+ getStateManager().destroy();
+ } finally {
+ mGLRootView.unlockRenderThread();
+ }
+ }
+
+ @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mGLRootView.lockRenderThread();
try {
diff --git a/src/com/android/gallery3d/app/Gallery.java b/src/com/android/gallery3d/app/Gallery.java
index e3937bcd0..60eb069fa 100644
--- a/src/com/android/gallery3d/app/Gallery.java
+++ b/src/com/android/gallery3d/app/Gallery.java
@@ -245,18 +245,6 @@ public final class Gallery extends AbstractGalleryActivity implements OnCancelLi
}
@Override
- public void onDestroy() {
- super.onDestroy();
- GLRoot root = getGLRoot();
- root.lockRenderThread();
- try {
- getStateManager().destroy();
- } finally {
- root.unlockRenderThread();
- }
- }
-
- @Override
protected void onResume() {
Utils.assertTrue(getStateManager().getStateCount() > 0);
super.onResume();
diff --git a/src/com/android/gallery3d/util/SpinnerVisibilitySetter.java b/src/com/android/gallery3d/util/SpinnerVisibilitySetter.java
index 6ccc26460..1e0534e90 100644
--- a/src/com/android/gallery3d/util/SpinnerVisibilitySetter.java
+++ b/src/com/android/gallery3d/util/SpinnerVisibilitySetter.java
@@ -21,6 +21,7 @@ import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
+import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
/**
@@ -47,25 +48,29 @@ public class SpinnerVisibilitySetter {
new WeakHashMap<Activity, SpinnerVisibilitySetter>();
private long mSpinnerVisibilityStartTime = -1;
- private Activity mActivity;
+ private WeakReference<Activity> mActivityRef;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
+ Activity activity = mActivityRef.get();
+
switch(msg.what) {
case MSG_SHOW_SPINNER:
removeMessages(MSG_SHOW_SPINNER);
+ if (activity == null) break;
if (mSpinnerVisibilityStartTime >= 0) break;
mSpinnerVisibilityStartTime = SystemClock.elapsedRealtime();
- mActivity.setProgressBarIndeterminateVisibility(true);
+ activity.setProgressBarIndeterminateVisibility(true);
break;
case MSG_HIDE_SPINNER:
removeMessages(MSG_HIDE_SPINNER);
+ if (activity == null) break;
if (mSpinnerVisibilityStartTime < 0) break;
long t = SystemClock.elapsedRealtime() - mSpinnerVisibilityStartTime;
if (t >= MIN_SPINNER_DISPLAY_TIME) {
mSpinnerVisibilityStartTime = -1;
- mActivity.setProgressBarIndeterminateVisibility(false);
+ activity.setProgressBarIndeterminateVisibility(false);
} else {
sendEmptyMessageDelayed(MSG_HIDE_SPINNER, MIN_SPINNER_DISPLAY_TIME - t);
}
@@ -91,7 +96,8 @@ public class SpinnerVisibilitySetter {
}
private SpinnerVisibilitySetter(Activity activity) {
- mActivity = activity;
+ // Activity are keys. Value objects should not strongly refer to keys.
+ mActivityRef = new WeakReference<Activity>(activity);
}
public void setSpinnerVisibility(boolean visible) {