У меня есть приложение, которое использует Loader
s для получения базы данных, которая также редактируется IntentService
. Я получаю данные от Loader
через реализацию LoaderCallbacks
, которая работает нормально.Нужно ли реализовать как LoaderCallbacks, так и OnLoadCompleteListener, чтобы получать уведомления об изменениях в ContentProvider?
Я также использую ContentResolver#notifyChange(Uri, ContentObserver)
для запуска перезагрузки. Однако это работает, только когда я звоню Cursor#setNotificationUri(Uri)
.
Я не могу найти ссылку на последний метод в любой документации, и, кажется, на самом деле это может быть причиной аварии: смотри также
Однако без этого вызова на Cursor
LoaderCallbacks#onLoadFinished(Loader<Cursor>, Cursor)
только ударить после начальной загрузки, а не после уведомления. Do I также нужно выполнить 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);
}
};
Можете ли вы опубликовать onLoadFinished метод? –
Это ваш собственный контент-провайдер или другой контент-провайдер. – ebarrenechea
@ Саксак Я положил их. –