【发布时间】:2015-05-21 17:55:42
【问题描述】:
有如下片段,在正常流程中,onCreateLoader 和 onLoadFinished 是成对调用的。 但是当数据源(数据库)内容发生变化时,由于加载器正在监视数据变化,加载器将再次调用 onLoadFinished() 并在光标中填充新数据。 但在我的情况下,它不想更改当前使用的游标,因此不希望加载器将更新后的游标传递给另一个 onLoadFinished 调用,或禁用加载器的监控部分。
有办法吗?
AFragment extends Fragment implements LoaderCallbacks<Cursor> {
protected void startSupportLoaderManager() {
getActivity().getSupportLoaderManager()
.initLoader(LOADER_ID, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return createLoader(getActivity(), id, args, null);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
if (mAdapter != null) {
mAdapter.resetCursor();
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
...
}
}
编辑: 有点知道这可能会奏效,但仍感觉缺少一些要点。这是什么想法: 在ContentProvider的实现中,对于insert()、update()、delete()我们做了
getContext().getContentResolver().notifyChange(uri, null);
在 CursorLoader 中它做了 cursor.registerContentObserver(mObserver);在
public Cursor loadInBackground() {
Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection,
mSelectionArgs, mSortOrder);
if (cursor != null) {
// Ensure the cursor window is filled
cursor.getCount();
cursor.registerContentObserver(mObserver);
}
return cursor;
}
所以它以某种方式监控 Uri 数据源的变化,就像我们在游标上所做的一样 cursor.setNotificationUri(getContext().getContentResolver(), uri);
因此,如果我们可以提供一个 Uri,它可以用于插入/更新/删除,但与我们提供给加载器的 Uri 不同,它仍然会执行惰性/更新/删除操作,但加载器不会由于 Uri 不同而通知。 所以基本上,加载器将使用与其他数据操作使用的 Uri 不同的 Uri。
不确定是否了解加载程序对内容 Uri 的监控是否正确。也许有更好的方法来做到这一点? 任何建议表示赞赏。
【问题讨论】:
-
您的内容提供商在哪里?
-
您要忽略第一个 onLoadFinished 调用之后的所有调用吗?
标签: android monitoring android-cursorloader