diff options
author | Gilles Debunne <debunne@google.com> | 2011-01-10 18:36:33 -0800 |
---|---|---|
committer | android-merger <android-build@android.com> | 2011-02-08 14:10:44 -0800 |
commit | 938ea7a4c149a73207297f2ed8ce283768311c98 (patch) | |
tree | 168e01915aa1416e8bb04ec945b00a505b6321a8 | |
parent | 3145ab8c1be61a63890b367f2a0e7d0056f2694f (diff) | |
download | base-938ea7a4c149a73207297f2ed8ce283768311c98.tar.gz |
All runnable are stopped on detach. DO NOT MERGE.
This prevents these runnable from holding a reference to the context
that will prevent it from being garbage collected.
The blinking cursor is especially bad and appears in memore traces.
Change-Id: I8acbfbbfc59975dfd7bcf06e941074ea7dc0b0bc
-rw-r--r-- | core/java/android/widget/TextView.java | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index ed1769692b20..ae5860ad2395 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -3815,6 +3815,18 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener hideError(); } + if (mBlink != null) { + mBlink.cancel(); + } + + if (mInsertionPointCursorController != null) { + mInsertionPointCursorController.onDetached(); + } + + if (mSelectionModifierCursorController != null) { + mSelectionModifierCursorController.onDetached(); + } + hideControllers(); } @@ -7718,6 +7730,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @param event The touch event */ public boolean onTouchEvent(MotionEvent event); + + /** + * Called when the view is detached from window. Perform house keeping task, such as + * stopping Runnable thread that would otherwise keep a reference on the context, thus + * preventing the activity to be recycled. + */ + public void onDetached(); } private class HandleView extends View { @@ -7995,12 +8014,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public void hide() { mHandle.hide(); - TextView.this.removeCallbacks(mHider); + removeCallbacks(mHider); } private void hideDelayed(int msec) { - TextView.this.removeCallbacks(mHider); - TextView.this.postDelayed(mHider, msec); + removeCallbacks(mHider); + postDelayed(mHider, msec); } public boolean isShowing() { @@ -8040,6 +8059,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener hide(); } } + + @Override + public void onDetached() { + removeCallbacks(mHider); + } } private class SelectionModifierCursorController implements CursorController { @@ -8197,6 +8221,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener hide(); } } + + @Override + public void onDetached() { + removeCallbacks(mHider); + } } private void hideInsertionPointCursorController() { |