Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

ContentProvider и отправка одного notifyChange для группы правок данных

#android #многопоточность #contentprovider


Сделал приложение, которое использует ContentProvider и ContentObserver для работы
с данными. В ContentProvider при обновлении данных вызывается notifyChange, который,
в свою очередь, отлавливается обсервером и приводит к обновлению списка на экране.

Проблема в том, что данные у меня отправляются пачками (через contentResolver.applyBatch).
Т.е. на несколько вызовов update у провайдера мне нужно делать только одно обновление
данных на экране. 

Насколько я понимаю, на уровне ContentProvider этого не сделать (по факту applyBatch
отправляет notifyChange на каждое обновление в базе), т.к. это логика более высокого
уровня. Хотя и не уверен в этом - возможно, в ContentProvider можно как-то определять
что данная операция последняя в пачке?

Может быть кто-то с таким сталкивался и у него есть работающая схема?

Дополнение:

Обнаружил, что в ContentProvider есть метод applyBatch, который можно перекрыть.

Получился вот такой вариант с некоторой, на мой взгляд, топорной защитой (по идее,
тут надо мьютекс использовать?):

static int batchDeep = 0;

@Override
public ContentProviderResult[]applyBatch(ArrayList operations)  
                                                  throws OperationApplicationException {
    try {
        batchDeep++;
        return super.applyBatch(operations);

    } finally {
        batchDeep--;
        if (batchDeep == 0)
            getContext().getContentResolver().notifyChange(URI_INDEX, null);
    }
};


И в методах, обновляющих данные:

@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] selectionArgs) {
    ...
    if (batchDeep == 0)
        getContext().getContentResolver().notifyChange(uri, null);
    ...
}


Теоретически, этот код, вроде-бы, делает то, что нужно. Но нет-ли здесь каких-то
подводных камней, связанных с параллельным исполнением?
    


Ответы

Ответ 1



ContentProvider заботиться как раз о таких подводных камнях, что и делает его привлекательным, подробнее ContentProvider android doc.

Комментариев нет:

Отправить комментарий