ContentProvider: Как отменить предыдущий вызов delete()?
Я использую пользовательский ContentProvider. Для запросов существует CancellationSignal (API 16+), который можно использовать для отмены предыдущего вызова query ().
Мой вопрос: как я могу архивировать это с delete()
? Для пояснения, мой пользовательский провайдер управляет файлами на SD-карте, и поэтому я хочу иметь возможность отменить операцию удаления внутри моего провайдера.
1 ответ
Я решил это с помощью простого решения.
Например, для каждого звонка query()
, мы помещаем параметр, указывающий на идентификатор задачи, и используем SparseBooleanArray для хранения этого идентификатора, например:
...
private static final SparseBooleanArray _MapInterruption = new SparseBooleanArray();
...
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor = ...
int taskId = ... // obtain task ID from uri
boolean cancel = ... // obtain cancellation flag from uri
if (cancel) {
_MapInterruption.put(taskId, true);
return null; // don't return any cursor
} else {
doQuery(taskId);
if (_MapInterruption.get(taskId)) {
_MapInterruption.delete(taskId);
return null; // because the task was cancelled
}
}
...
return cursor;
}// query()
private void doQuery(int taskId) {
while (!_MapInterruption.get(taskId)) {
... // do the task here
}
}// doQuery()
Использование:
Запросить:
... getContentResolver().query("content://your-uri?task_id=1", ...);
Отменить:
... getContentResolver().query("content://your-uri?task_id=1&cancel=true", ...);
Для полного рабочего решения взгляните на http://code.google.com/p/android-filechooser/.
Преимущество в том, что вы можете использовать эту технику в Android… 1+ и для других методов, таких как delete()
, update()
... Хотя CancellationSignal доступен только в API 16+ и ограничен только query()
,