From ec84c3a189e4aa70aa6ea8ba712e5a4f260a153b Mon Sep 17 00:00:00 2001 From: Patrick Dubroy Date: Thu, 13 Jan 2011 17:55:37 -0800 Subject: Allow old view hierarchy to be GC'ed more quickly during rotation. --- core/java/android/widget/AdapterViewAnimator.java | 6 ++++++ core/java/android/widget/ProgressBar.java | 4 +++- core/java/android/widget/RemoteViewsAdapter.java | 9 ++++----- 3 files changed, 13 insertions(+), 6 deletions(-) (limited to 'core/java/android/widget') diff --git a/core/java/android/widget/AdapterViewAnimator.java b/core/java/android/widget/AdapterViewAnimator.java index ec8e93c..1b39371 100644 --- a/core/java/android/widget/AdapterViewAnimator.java +++ b/core/java/android/widget/AdapterViewAnimator.java @@ -986,4 +986,10 @@ public abstract class AdapterViewAnimator extends AdapterView public void willBeAdvancedByHost() { } + + @Override + protected void onDetachedFromWindow() { + mAdapter = null; + super.onDetachedFromWindow(); + } } diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java index 5b143fe..ef4e4e0 100644 --- a/core/java/android/widget/ProgressBar.java +++ b/core/java/android/widget/ProgressBar.java @@ -1004,9 +1004,11 @@ public class ProgressBar extends View { @Override protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); if (mIndeterminate) { stopAnimation(); } + // This should come after stopAnimation(), otherwise an invalidate message remains in the + // queue, which can prevent the entire view hierarchy from being GC'ed during a rotation + super.onDetachedFromWindow(); } } diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java index a7bff62..df1f4bf 100644 --- a/core/java/android/widget/RemoteViewsAdapter.java +++ b/core/java/android/widget/RemoteViewsAdapter.java @@ -152,6 +152,7 @@ public class RemoteViewsAdapter extends BaseAdapter { if (callback != null) { callback.onRemoteAdapterDisconnected(); } + adapter.mCache.reset(); } public IRemoteViewsFactory getRemoteViewsFactory() { @@ -657,11 +658,9 @@ public class RemoteViewsAdapter extends BaseAdapter { try { remoteViews = factory.getViewAt(position); itemId = factory.getItemId(position); - } catch (Exception e) { - // Print the error - Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + - e.getMessage()); - e.printStackTrace(); + } catch (Throwable t) { + Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + t.getMessage()); + t.printStackTrace(); // Return early to prevent additional work in re-centering the view cache, and // swapping from the loading view -- cgit v1.1