我有一个应用程序正在使用Loader
s 获取数据库,该数据库也正在由IntentService
. Loader
我通过实现从 接收数据,该LoaderCallbacks
实现工作正常。
我也ContentResolver#notifyChange(Uri, ContentObserver)
用来触发重新加载。但是,这只在我Cursor#setNotificationUri(Uri)
事先打电话时才有效。
我在任何文档中都找不到对后一种方法的引用,实际上这似乎可能导致崩溃:另请参阅
来自 ContentProvider 的 SimpleCursorAdapter 中的 IllegalStateException“尝试重新打开已经关闭的对象”
但是,如果没有此调用,Cursor
则LoaderCallbacks#onLoadFinished(Loader<Cursor>, Cursor)
只会在初始加载后被点击,而不是在通知之后。我是否还需要实现一个OnLoadCompleteListener
完全一样的事情?
ContentProvider
查询方法:
class MyContentProvider extends ContentProvider {
//...
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor query = db.query(getTableName(uri), projection, selection, selectionArgs, null, null, sortOrder);
query.setNotificationUri(getContext().getContentResolver(), uri);
return query;
}
//...
}
典型LoaderCallbacks
:
LoaderCallbacks<Cursor> mCallbacks = new LoaderCallbacks<Cursor>() {
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mArticleAdapter.swapCursor(null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if(cursor.isClosed()) {
Log.d(TAG, "CURSOR RETURNED CLOSED");
Activity activity = getActivity();
if(activity!=null) {
activity.getLoaderManager().restartLoader(mFragmentId, null, mCallbacks);
}
return;
}
mArticleAdapter.swapCursor(cursor);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
triggerArticleFeed();
CursorLoader cursorLoader = null;
if(id == mFragmentId) {
cursorLoader = new CursorLoader(getActivity(),
MyContentProvider.ARTICLES_URI,
null,
ArticlesContentHelper.ARTICLES_WHERE,
ArticlesContentHelper.ARTICLES_WHEREARGS,
null);
}
return(cursorLoader);
}
};