Close suggestion cursors that arrive after adapter is closed
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 = :("
This commit is contained in:
@@ -428,7 +428,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
|
||||
mSearchAutoComplete.setAdapter((SuggestionsAdapter)null);
|
||||
// close any leftover cursor
|
||||
if (mSuggestionsAdapter != null) {
|
||||
mSuggestionsAdapter.changeCursor(null);
|
||||
mSuggestionsAdapter.close();
|
||||
}
|
||||
mSuggestionsAdapter = null;
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
|
||||
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;
|
||||
@@ -199,6 +200,12 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
public void close() {
|
||||
if (DBG) Log.d(LOG_TAG, "close()");
|
||||
changeCursor(null);
|
||||
mClosed = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cache columns.
|
||||
*/
|
||||
@@ -206,6 +213,12 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user