Bug 834414 - Stop holding on to a content resolver in Tab, which leaks the Activity instance it is associated with. r=bnicholson

This commit is contained in:
Kartikaya Gupta
2013-01-25 13:51:41 -05:00
parent f428699d84
commit 4223b73977
2 changed files with 33 additions and 17 deletions

View File

@@ -16,6 +16,7 @@ import android.accounts.AccountManager;
import android.accounts.OnAccountsUpdateListener;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.ContentObserver;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;
@@ -55,6 +56,7 @@ public class Tabs implements GeckoEventListener {
private static AtomicInteger sTabId = new AtomicInteger(0);
private GeckoApp mActivity;
private ContentObserver mContentObserver;
private Tabs() {
registerEventListener("SessionHistory:New");
@@ -82,6 +84,9 @@ public class Tabs implements GeckoEventListener {
persistAllTabs();
}
}, GeckoAppShell.getHandler(), false);
if (mContentObserver != null) {
BrowserDB.registerBookmarkObserver(getContentResolver(), mContentObserver);
}
}
public void detachFromActivity(GeckoApp activity) {
@@ -89,13 +94,31 @@ public class Tabs implements GeckoEventListener {
mAccountManager.removeOnAccountsUpdatedListener(mAccountListener);
mAccountListener = null;
}
if (mContentObserver != null) {
BrowserDB.unregisterContentObserver(getContentResolver(), mContentObserver);
}
}
public int getCount() {
return mTabs.size();
}
private void lazyRegisterBookmarkObserver() {
if (mContentObserver == null) {
mContentObserver = new ContentObserver(null) {
public void onChange(boolean selfChange) {
for (Tab tab : mTabs.values()) {
tab.updateBookmark();
}
}
};
BrowserDB.registerBookmarkObserver(getContentResolver(), mContentObserver);
}
}
private Tab addTab(int id, String url, boolean external, int parentId, String title, boolean isPrivate) {
lazyRegisterBookmarkObserver();
final Tab tab = isPrivate ? new PrivateTab(id, url, external, parentId, title) :
new Tab(id, url, external, parentId, title);
mTabs.put(id, tab);