Fix some bugs introduced in LoaderActivity
Change-Id: Iad34bbcd17a601660dc9a235276f460cc3c4c957
diff --git a/LoaderApp/src/android/app/patterns/CursorLoader.java b/LoaderApp/src/android/app/patterns/CursorLoader.java
index 589be4f..be7bee2 100644
--- a/LoaderApp/src/android/app/patterns/CursorLoader.java
+++ b/LoaderApp/src/android/app/patterns/CursorLoader.java
@@ -65,6 +65,8 @@
*/
@Override
public void startLoading() {
+ mStopped = false;
+
if (mCursor != null) {
deliverResult(mCursor);
} else {
diff --git a/LoaderApp/src/android/app/patterns/Loader.java b/LoaderApp/src/android/app/patterns/Loader.java
index e3005d2..275eb4f 100644
--- a/LoaderApp/src/android/app/patterns/Loader.java
+++ b/LoaderApp/src/android/app/patterns/Loader.java
@@ -45,7 +45,7 @@
/**
* Called on the thread that created the Loader when the load is complete.
*
- * @param id the ID of the loader that completed the load
+ * @param loader the loader that completed the load
* @param data the result of the load
*/
public void onLoadComplete(Loader loader, D data);
@@ -93,9 +93,9 @@
* Must be called from the UI thread
*/
public void registerListener(int id, OnLoadCompleteListener<D> listener) {
-// if (mListener != null) {
- // throw new IllegalStateException("There is already a listener registered");
- // }
+ if (mListener != null) {
+ throw new IllegalStateException("There is already a listener registered");
+ }
mListener = listener;
mId = id;
}
diff --git a/LoaderApp/src/android/app/patterns/LoaderActivity.java b/LoaderApp/src/android/app/patterns/LoaderActivity.java
index 5e4c4bd..178cbbc 100644
--- a/LoaderApp/src/android/app/patterns/LoaderActivity.java
+++ b/LoaderApp/src/android/app/patterns/LoaderActivity.java
@@ -28,6 +28,8 @@
*/
public abstract class LoaderActivity<D> extends Activity implements
Loader.OnLoadCompleteListener<D> {
+ private boolean mStarted = false;
+
static final class LoaderInfo {
public Bundle args;
public Loader loader;
@@ -53,9 +55,13 @@
}
mLoaders.put(id, info);
loader = onCreateLoader(id, args);
- loader.registerListener(id, this);
- loader.startLoading();
info.loader = loader;
+ if (mStarted) {
+ // The activity will start all existing loaders in it's onStart(), so only start them
+ // here if we're past that point of the activitiy's life cycle
+ loader.registerListener(id, this);
+ loader.startLoading();
+ }
}
protected abstract Loader onCreateLoader(int id, Bundle args);
@@ -90,11 +96,12 @@
if (loader == null) {
loader = onCreateLoader(id, info.args);
info.loader = loader;
- } else {
- loader.registerListener(id, this);
}
+ loader.registerListener(id, this);
loader.startLoading();
}
+
+ mStarted = true;
}
@Override
@@ -112,10 +119,12 @@
loader.unregisterListener(this);
// The loader isn't getting passed along to the next instance so ask it to stop loading
-// if (!isChangingConfigurations()) {
-// loader.stopLoading();
-// }
+ if (!isChangingConfigurations()) {
+ loader.stopLoading();
+ }
}
+
+ mStarted = false;
}
@Override
diff --git a/LoaderApp/src/com/android/loaderapp/DetailsNormal.java b/LoaderApp/src/com/android/loaderapp/DetailsNormal.java
index 686a5b4..be0b586 100644
--- a/LoaderApp/src/com/android/loaderapp/DetailsNormal.java
+++ b/LoaderApp/src/com/android/loaderapp/DetailsNormal.java
@@ -43,7 +43,9 @@
@Override
public void onInitializeLoaders() {
- startLoading(LOADER_DETAILS, null);
+ Bundle args = new Bundle();
+ args.putParcelable("uri", getIntent().getData());
+ startLoading(LOADER_DETAILS, args);
}
@Override
diff --git a/LoaderApp/src/com/android/loaderapp/model/ContactLoader.java b/LoaderApp/src/com/android/loaderapp/model/ContactLoader.java
index 7a75f0d..b544e84 100644
--- a/LoaderApp/src/com/android/loaderapp/model/ContactLoader.java
+++ b/LoaderApp/src/com/android/loaderapp/model/ContactLoader.java
@@ -28,7 +28,6 @@
* Loads a single Contact and all it constituent RawContacts.
*/
public class ContactLoader extends Loader<ContactLoader.ContactData> {
- Context mContext;
Uri mLookupUri;
ContactData mContact;
ForceLoadContentObserver mObserver;
@@ -59,7 +58,7 @@
@Override
protected ContactData doInBackground(Void... args) {
- ContentResolver resolver = mContext.getContentResolver();
+ ContentResolver resolver = getContext().getContentResolver();
ContactData result = new ContactData();
// Undo the lookup URI
@@ -147,7 +146,7 @@
if (mObserver == null) {
mObserver = new ForceLoadContentObserver();
}
- mContext.getContentResolver().registerContentObserver(mLookupUri, true, mObserver);
+ getContext().getContentResolver().registerContentObserver(mLookupUri, true, mObserver);
deliverResult(result);
}
}
@@ -176,7 +175,7 @@
public void stopLoading() {
mContact = null;
if (mObserver != null) {
- mContext.getContentResolver().unregisterContentObserver(mObserver);
+ getContext().getContentResolver().unregisterContentObserver(mObserver);
}
}