#android #многопоточность #contentprovider
Сделал приложение, которое использует ContentProvider и ContentObserver для работы с данными. В ContentProvider при обновлении данных вызывается notifyChange, который, в свою очередь, отлавливается обсервером и приводит к обновлению списка на экране. Проблема в том, что данные у меня отправляются пачками (через contentResolver.applyBatch). Т.е. на несколько вызовов update у провайдера мне нужно делать только одно обновление данных на экране. Насколько я понимаю, на уровне ContentProvider этого не сделать (по факту applyBatch отправляет notifyChange на каждое обновление в базе), т.к. это логика более высокого уровня. Хотя и не уверен в этом - возможно, в ContentProvider можно как-то определять что данная операция последняя в пачке? Может быть кто-то с таким сталкивался и у него есть работающая схема? Дополнение: Обнаружил, что в ContentProvider есть метод applyBatch, который можно перекрыть. Получился вот такой вариант с некоторой, на мой взгляд, топорной защитой (по идее, тут надо мьютекс использовать?): static int batchDeep = 0; @Override public ContentProviderResult[]applyBatch(ArrayListoperations) 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.
Комментариев нет:
Отправить комментарий