我有一个正在使用的应用程序Loader
s到获得在这也被编辑过的数据库IntentService
。 我从接收数据Loader
通过LoaderCallbacks
实现,这是工作的罚款。
我也使用ContentResolver#notifyChange(Uri, ContentObserver)
来触发重新加载。 然而,当我把这个只适用Cursor#setNotificationUri(Uri)
提前。
我能找到没有提及任何文档中的后一种方法,它似乎在事实上,这可能会导致崩溃:又见
IllegalStateException异常“试图重新打开已关闭的对象”在SimpleCursorAdapter从ContentProvider的
然而,如果没有在此呼叫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);
}
};