我有一个自定义ContentProvider管理对 SQLite 数据库的访问。要在 a 中加载数据库表的内容ListFragment,我使用LoaderManagerwith aCursorLoader和 a CursorAdapter:
public class MyListFragment extends ListFragment implements LoaderCallbacks<Cursor> {
// ...
CursorAdapter mAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new CursorAdapter(getActivity(), null, 0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(), CONTENT_URI, PROJECTION, null, null, null);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
mAdapter.swapCursor(c);
}
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
SQLite 数据库由后台任务更新,该任务从 Web 服务中获取许多项目,并通过ContentProvider批处理操作将这些项目插入数据库 ( ContentResolver#applyBatch())。
即使这是一个批处理操作,ContentProvider#insert()每个行的调用都会被插入到数据库中,并且在当前的实现中,每个插入命令的ContentProvider调用setNotificationUri()。
结果是CursorAdapter接收到大量通知,导致 UI 更新过于频繁,从而产生烦人的闪烁效果。
理想情况下,当批处理操作正在进行时,应该有一种方法ContentObserver只在任何批处理操作结束时通知,而不是在每个插入命令时通知。
有人知道这是否可能吗?请注意,我可以更改ContentProvider实现并覆盖其任何方法。