ContentProvider:如何取消之前的delete()调用?

时间:2012-12-06 09:44:10

标签: android-contentprovider cancellation

我正在使用自定义ContentProvider。对于查询,有CancellationSignal(API 16+),可用于取消之前对query()的调用。

我的问题:如何使用delete()存档?为了澄清,我的自定义提供程序管理SD卡上的文件,因此我希望能够取消提供程序内的删除操作。

1 个答案:

答案 0 :(得分:0)

我用一个简单的解决方案解决了这个问题。

例如,对于query()的每次调用,我们都会将参数指向任务ID,并使用SparseBooleanArray来保存该ID,例如:

...
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", ...);
    

要获得完整的解决方案,请查看android-filechooser

优点是你可以在Android ... 1+和其他方法中使用此技术,例如delete()update() ...虽然CancellationSignal仅适用于API 16+和仅限query()