Android ContentProvider вызывает пакеты setNotificationUri() для CursorAdapter, когда много строк вставляются с помощью пакетной операции.

У меня есть собственный 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и переопределить любой из его методов.

11
задан Gaurav Agarwal 21 May 2012 в 05:02
поделиться