我有一个自定义ContentProvider
管理对 SQLite 数据库的访问。要在 a 中加载数据库表的内容ListFragment
,我使用LoaderManager
with 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
实现并覆盖其任何方法。