0

カスタムContentProviderを使用しています。クエリには、以前のquery()の呼び出しをキャンセルするために使用できるCancellationSignal (API 16+)があります。

私の質問:どうすればそれをアーカイブできdelete()ますか?明確にするために、私のカスタムプロバイダーはSDカード上のファイルを管理しているので、プロバイダー内の削除操作をキャンセルできるようにしたいと思います。

4

1 に答える 1

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()ます。

于 2012-12-09T03:58:06.290 に答える