From fb6aafde995cfaeb57f3009f10a4c0c843993162 Mon Sep 17 00:00:00 2001 From: Owen Lin Date: Wed, 29 Aug 2012 16:36:08 +0800 Subject: Fix OOM in TileImageView. The problem is we keep too many decoded images in the upload queue. Those images will be free after it getting uploaded. However, there is a bug which suspend the uploading sometimes. Change-Id: Id97c04eba974cc77e5d8c50588b0cbef776f79da fix: 6995091 --- src/com/android/gallery3d/ui/TileImageView.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/com/android/gallery3d/ui/TileImageView.java') diff --git a/src/com/android/gallery3d/ui/TileImageView.java b/src/com/android/gallery3d/ui/TileImageView.java index fc61efd64..9eb4f4787 100644 --- a/src/com/android/gallery3d/ui/TileImageView.java +++ b/src/com/android/gallery3d/ui/TileImageView.java @@ -270,6 +270,7 @@ public class TileImageView extends GLView { protected synchronized void invalidateTiles() { mDecodeQueue.clean(); mUploadQueue.clean(); + // TODO disable decoder int n = mActiveTiles.size(); for (int i = 0; i < n; i++) { @@ -553,21 +554,23 @@ public class TileImageView extends GLView { @Override public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { - if (renderRequested) return false; + // Skips uploading if there is a pending rendering request. + // Returns true to keep uploading in next rendering loop. + if (renderRequested) return true; int quota = UPLOAD_LIMIT; - Tile tile; - while (true) { + Tile tile = null; + while (quota > 0) { synchronized (TileImageView.this) { tile = mUploadQueue.pop(); } - if (tile == null || quota <= 0) break; + if (tile == null) break; if (!tile.isContentValid()) { Utils.assertTrue(tile.mTileState == STATE_DECODED); tile.updateContent(canvas); --quota; } } - mActive.set(tile != null); + if (tile == null) mActive.set(false); return tile != null; } } -- cgit v1.2.3