У меня есть пользовательский ContentProvider
, который управляет доступом к базе данных SQLite. Чтобы загрузить содержимое таблицы базы данных в ListFragment
, я использую LoaderManager
с CursorLoader
и 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 обновляется с помощью фоновой задачи, которая выбирает несколько элементов из веб-службы и вставляет эти элементы в базу данных с помощью ContentProvider
пакетных операций (ContentResolver#applyBatch()
).
Даже если это пакетная операция, ContentProvider#insert()
вызывается для каждой строки, вставленной в базу данных, и в текущей реализации ContentProvider
вызывает setNotificationUri()
для каждой команды вставки.
В результате CursorAdapter
получает пакеты уведомлений, в результате чего пользовательский интерфейс обновляется слишком часто с последующим раздражающим эффектом мерцания.
В идеале, когда выполняется пакетная операция, должен быть способ уведомлять ContentObserver
только в конце любой пакетной операции, а не с каждой командой вставки.
Кто-нибудь знает, возможно ли это? Обратите внимание, что я могу изменить реализацию ContentProvider
и переопределить любой из ее методов.