Before, after using the Browser, memory-hungry apps could
become very sluggish. This was because the search dialog in the
system process had the BrowserProvider open, which in turn had
EnhancedGoogleSearch open. Since EhancedGoogleSearch runs in acore,
the system would keep both the Browser process and acore to stay
around forever.
The cause (or at least one common cause) for this was that
if the user types quickly, and clicks on a suggestion before
the displayed suggestions have caught up, some suggestion cursors
are not be closed.
This change solves this problem by adding a close() method to
SuggestionsAdapter. SuggestionsAdapter now closes any cursors
that are passed to it after close() is called.
Fixes http://b/issue?id=
2078226
"global search holding reference to browser: system -> browser -> acore = :("
mSearchAutoComplete.setAdapter((SuggestionsAdapter)null);
// close any leftover cursor
if (mSuggestionsAdapter != null) {
- mSuggestionsAdapter.changeCursor(null);
+ mSuggestionsAdapter.close();
}
mSuggestionsAdapter = null;
}
private WeakHashMap<String, Drawable.ConstantState> mOutsideDrawablesCache;
private SparseArray<Drawable.ConstantState> mBackgroundsCache;
private boolean mGlobalSearchMode;
+ private boolean mClosed = false;
// Cached column indexes, updated when the cursor changes.
private int mFormatCol;
}
}
+ public void close() {
+ if (DBG) Log.d(LOG_TAG, "close()");
+ changeCursor(null);
+ mClosed = true;
+ }
+
/**
* Cache columns.
*/
public void changeCursor(Cursor c) {
if (DBG) Log.d(LOG_TAG, "changeCursor(" + c + ")");
+ if (mClosed) {
+ Log.w(LOG_TAG, "Tried to change cursor after adapter was closed.");
+ if (c != null) c.close();
+ return;
+ }
+
try {
Cursor oldCursor = getCursor();
super.changeCursor(c);