diff options
author | Winson Chung <winsonc@google.com> | 2011-09-29 13:44:19 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-09-29 13:44:19 -0700 |
commit | 1a540a83647dbf94941f78025eba73d114dc0b47 (patch) | |
tree | 857e3372a6370198b2ee55fbbcaed92061b38bea | |
parent | 32343bd4bee4bd793c2d61f0985e723e61638d37 (diff) | |
parent | 099459377a737d885bbd8ac4d52e6884a103b1c7 (diff) | |
download | packages_apps_trebuchet-1a540a83647dbf94941f78025eba73d114dc0b47.zip packages_apps_trebuchet-1a540a83647dbf94941f78025eba73d114dc0b47.tar.gz packages_apps_trebuchet-1a540a83647dbf94941f78025eba73d114dc0b47.tar.bz2 |
Merge "Clean up bitmaps when necessary in the widget tray to prevent likelihood of OOM. (Bug: 5348390)"
-rw-r--r-- | src/com/android/launcher2/AppsCustomizePagedView.java | 109 | ||||
-rw-r--r-- | src/com/android/launcher2/PagedViewWidget.java | 18 |
2 files changed, 88 insertions, 39 deletions
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index 6493e97..560c3c7 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -96,6 +96,25 @@ class AsyncTaskPageData { doInBackgroundCallback = bgR; postExecuteCallback = postR; } + void cleanup(boolean cancelled) { + // Clean up any references to source/generated bitmaps + if (sourceImages != null) { + if (cancelled) { + for (Bitmap b : sourceImages) { + b.recycle(); + } + } + sourceImages.clear(); + } + if (generatedImages != null) { + if (cancelled) { + for (Bitmap b : generatedImages) { + b.recycle(); + } + } + generatedImages.clear(); + } + } int page; ArrayList<Object> items; ArrayList<Bitmap> sourceImages; @@ -746,21 +765,31 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen @Override public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) { try { - Thread.sleep(sleepMs); - } catch (Exception e) {} - loadWidgetPreviewsInBackground(task, data); + try { + Thread.sleep(sleepMs); + } catch (Exception e) {} + loadWidgetPreviewsInBackground(task, data); + } finally { + if (task.isCancelled()) { + data.cleanup(true); + } + } } }, new AsyncTaskCallback() { @Override public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) { - mRunningTasks.remove(task); - if (task.isCancelled()) return; - if (task.page > getPageCount()) return; - if (task.pageContentType != mContentType) return; - onSyncWidgetPageItems(data); + try { + mRunningTasks.remove(task); + if (task.isCancelled()) return; + if (task.page > getPageCount()) return; + if (task.pageContentType != mContentType) return; + onSyncWidgetPageItems(data); + } finally { + data.cleanup(task.isCancelled()); + } } - }); + }); // Ensure that the task is appropriately prioritized and runs in parallel AppsCustomizeAsyncTask t = new AppsCustomizeAsyncTask(page, mContentType, @@ -790,40 +819,50 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen new AsyncTaskCallback() { @Override public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) { - // Ensure that this task starts running at the correct priority - task.syncThreadPriority(); - - ArrayList<Bitmap> images = data.generatedImages; - ArrayList<Bitmap> srcImages = data.sourceImages; - int count = srcImages.size(); - Canvas c = new Canvas(); - for (int i = 0; i < count && !task.isCancelled(); ++i) { - // Before work on each item, ensure that this task is running at the correct - // priority + try { + // Ensure that this task starts running at the correct priority task.syncThreadPriority(); - Bitmap b = srcImages.get(i); - Bitmap outline = Bitmap.createBitmap(b.getWidth(), b.getHeight(), - Bitmap.Config.ARGB_8888); - - c.setBitmap(outline); - c.save(); - c.drawBitmap(b, 0, 0, null); - c.restore(); - c.setBitmap(null); - - images.add(outline); + ArrayList<Bitmap> images = data.generatedImages; + ArrayList<Bitmap> srcImages = data.sourceImages; + int count = srcImages.size(); + Canvas c = new Canvas(); + for (int i = 0; i < count && !task.isCancelled(); ++i) { + // Before work on each item, ensure that this task is running at the correct + // priority + task.syncThreadPriority(); + + Bitmap b = srcImages.get(i); + Bitmap outline = Bitmap.createBitmap(b.getWidth(), b.getHeight(), + Bitmap.Config.ARGB_8888); + + c.setBitmap(outline); + c.save(); + c.drawBitmap(b, 0, 0, null); + c.restore(); + c.setBitmap(null); + + images.add(outline); + } + } finally { + if (task.isCancelled()) { + data.cleanup(true); + } } } }, new AsyncTaskCallback() { @Override public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) { - mRunningTasks.remove(task); - if (task.isCancelled()) return; - if (task.page > getPageCount()) return; - if (task.pageContentType != mContentType) return; - onHolographicPageItemsLoaded(data); + try { + mRunningTasks.remove(task); + if (task.isCancelled()) return; + if (task.page > getPageCount()) return; + if (task.pageContentType != mContentType) return; + onHolographicPageItemsLoaded(data); + } finally { + data.cleanup(task.isCancelled()); + } } }); diff --git a/src/com/android/launcher2/PagedViewWidget.java b/src/com/android/launcher2/PagedViewWidget.java index 053c2ea..4e06570 100644 --- a/src/com/android/launcher2/PagedViewWidget.java +++ b/src/com/android/launcher2/PagedViewWidget.java @@ -96,6 +96,20 @@ public class PagedViewWidget extends LinearLayout implements Checkable { setClipToPadding(false); } + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + final ImageView image = (ImageView) findViewById(R.id.widget_preview); + if (image != null) { + FastBitmapDrawable preview = (FastBitmapDrawable) image.getDrawable(); + if (preview != null && preview.getBitmap() != null) { + preview.getBitmap().recycle(); + } + image.setImageDrawable(null); + } + } + public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info, FastBitmapDrawable preview, int maxWidth, int[] cellSpan, HolographicOutlineHelper holoOutlineHelper) { @@ -109,11 +123,9 @@ public class PagedViewWidget extends LinearLayout implements Checkable { mPreviewImageView = image; final TextView name = (TextView) findViewById(R.id.widget_name); name.setText(info.label); - name.setLayerType(View.LAYER_TYPE_SOFTWARE, null); final TextView dims = (TextView) findViewById(R.id.widget_dims); if (dims != null) { dims.setText(String.format(mDimensionsFormatString, cellSpan[0], cellSpan[1])); - dims.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } } @@ -127,11 +139,9 @@ public class PagedViewWidget extends LinearLayout implements Checkable { mPreviewImageView = image; final TextView name = (TextView) findViewById(R.id.widget_name); name.setText(label); - name.setLayerType(View.LAYER_TYPE_SOFTWARE, null); final TextView dims = (TextView) findViewById(R.id.widget_dims); if (dims != null) { dims.setText(String.format(mDimensionsFormatString, 1, 1)); - dims.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } } |