Last active
July 28, 2024 11:13
-
-
Save cbeyls/7615061 to your computer and use it in GitHub Desktop.
A CursorLoader to implement simple monitorable database queries without a ContentProvider.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package be.digitalia.fosdem.loaders; | |
import android.content.Context; | |
import android.database.Cursor; | |
import android.support.v4.content.AsyncTaskLoader; | |
/** | |
* A CursorLoader that doesn't need a ContentProvider. | |
* | |
* @author Christophe Beyls | |
*/ | |
public abstract class SimpleCursorLoader extends AsyncTaskLoader<Cursor> { | |
private final ForceLoadContentObserver mObserver; | |
private Cursor mCursor; | |
/* Runs on a worker thread */ | |
@Override | |
public Cursor loadInBackground() { | |
Cursor cursor = getCursor(); | |
if (cursor != null) { | |
// Ensure the cursor window is filled | |
cursor.getCount(); | |
cursor.registerContentObserver(mObserver); | |
} | |
return cursor; | |
} | |
/* Runs on the UI thread */ | |
@Override | |
public void deliverResult(Cursor cursor) { | |
if (isReset()) { | |
// An async query came in while the loader is stopped | |
if (cursor != null) { | |
cursor.close(); | |
} | |
return; | |
} | |
Cursor oldCursor = mCursor; | |
mCursor = cursor; | |
if (isStarted()) { | |
super.deliverResult(cursor); | |
} | |
if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) { | |
oldCursor.close(); | |
} | |
} | |
public SimpleCursorLoader(Context context) { | |
super(context); | |
mObserver = new ForceLoadContentObserver(); | |
} | |
/** | |
* Starts an asynchronous load of the data. When the result is ready the callbacks will be called on the UI thread. If a previous load has been completed | |
* and is still valid the result may be passed to the callbacks immediately. | |
* | |
* Must be called from the UI thread | |
*/ | |
@Override | |
protected void onStartLoading() { | |
if (mCursor != null) { | |
deliverResult(mCursor); | |
} | |
if (takeContentChanged() || mCursor == null) { | |
forceLoad(); | |
} | |
} | |
/** | |
* Must be called from the UI thread | |
*/ | |
@Override | |
protected void onStopLoading() { | |
// Attempt to cancel the current load task if possible. | |
cancelLoad(); | |
} | |
@Override | |
public void onCanceled(Cursor cursor) { | |
if (cursor != null && !cursor.isClosed()) { | |
cursor.close(); | |
} | |
// Retry a refresh the next time the loader is started | |
onContentChanged(); | |
} | |
@Override | |
protected void onReset() { | |
super.onReset(); | |
// Ensure the loader is stopped | |
onStopLoading(); | |
if (mCursor != null && !mCursor.isClosed()) { | |
mCursor.close(); | |
} | |
mCursor = null; | |
} | |
protected abstract Cursor getCursor(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
can u please provide a complete example with this one?