Merge "Some fixes to the new loader management."
diff --git a/core/java/android/app/LoaderManager.java b/core/java/android/app/LoaderManager.java
index cccf6e8..7125054 100644
--- a/core/java/android/app/LoaderManager.java
+++ b/core/java/android/app/LoaderManager.java
@@ -147,7 +147,10 @@
LoaderManager.LoaderCallbacks<D> callback);
/**
- * Stops and removes the loader with the given ID.
+ * Stops and removes the loader with the given ID. If this loader
+ * had previously reported data to the client through
+ * {@link LoaderCallbacks#onLoadFinished(Loader, Object)}, a call
+ * will be made to {@link LoaderCallbacks#onLoaderReset(Loader)}.
*/
public abstract void destroyLoader(int id);
@@ -397,7 +400,8 @@
writer.print(prefix); writer.print("mData="); writer.println(mData);
writer.print(prefix); writer.print("mStarted="); writer.print(mStarted);
writer.print(" mRetaining="); writer.print(mRetaining);
- writer.print(" mDestroyed="); writer.print(mDestroyed);
+ writer.print(" mDestroyed="); writer.println(mDestroyed);
+ writer.print(prefix); writer.print("mNeedReset="); writer.print(mNeedReset);
writer.print(" mListenerRegistered="); writer.println(mListenerRegistered);
}
}
@@ -491,6 +495,12 @@
mLoaders.removeAt(idx);
info.destroy();
}
+ idx = mInactiveLoaders.indexOfKey(id);
+ if (idx >= 0) {
+ LoaderInfo info = mInactiveLoaders.valueAt(idx);
+ mInactiveLoaders.removeAt(idx);
+ info.destroy();
+ }
}
@SuppressWarnings("unchecked")
diff --git a/core/java/android/content/CursorLoader.java b/core/java/android/content/CursorLoader.java
index c73f95d..9e03c25 100644
--- a/core/java/android/content/CursorLoader.java
+++ b/core/java/android/content/CursorLoader.java
@@ -27,6 +27,7 @@
Cursor mCursor;
ForceLoadContentObserver mObserver;
boolean mStopped;
+ boolean mContentChanged;
boolean mReset;
Uri mUri;
String[] mProjection;
@@ -102,7 +103,9 @@
if (mCursor != null) {
deliverResult(mCursor);
- } else {
+ }
+ if (mCursor == null || mContentChanged) {
+ mContentChanged = false;
forceLoad();
}
}
@@ -120,6 +123,18 @@
}
@Override
+ public void onContentChanged() {
+ if (mStopped) {
+ // This loader has been stopped, so we don't want to load
+ // new data right now... but keep track of it changing to
+ // refresh later if we start again.
+ mContentChanged = true;
+ return;
+ }
+ super.onContentChanged();
+ }
+
+ @Override
public void onCancelled(Cursor cursor) {
if (cursor != null && !cursor.isClosed()) {
cursor.close();