summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/LoaderManager.java14
-rw-r--r--core/java/android/content/CursorLoader.java17
2 files changed, 28 insertions, 3 deletions
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 @@ public abstract class LoaderManager {
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 @@ class LoaderManagerImpl extends LoaderManager {
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 @@ class LoaderManagerImpl extends LoaderManager {
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 @@ public class CursorLoader extends AsyncTaskLoader<Cursor> {
Cursor mCursor;
ForceLoadContentObserver mObserver;
boolean mStopped;
+ boolean mContentChanged;
boolean mReset;
Uri mUri;
String[] mProjection;
@@ -102,7 +103,9 @@ public class CursorLoader extends AsyncTaskLoader<Cursor> {
if (mCursor != null) {
deliverResult(mCursor);
- } else {
+ }
+ if (mCursor == null || mContentChanged) {
+ mContentChanged = false;
forceLoad();
}
}
@@ -120,6 +123,18 @@ public class CursorLoader extends AsyncTaskLoader<Cursor> {
}
@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();