カスタムContentProviderを使用しています。クエリには、以前のquery()の呼び出しをキャンセルするために使用できるCancellationSignal (API 16+)があります。
私の質問:どうすればそれをアーカイブできdelete()
ますか?明確にするために、私のカスタムプロバイダーはSDカード上のファイルを管理しているので、プロバイダー内の削除操作をキャンセルできるようにしたいと思います。
カスタムContentProviderを使用しています。クエリには、以前のquery()の呼び出しをキャンセルするために使用できるCancellationSignal (API 16+)があります。
私の質問:どうすればそれをアーカイブできdelete()
ますか?明確にするために、私のカスタムプロバイダーはSDカード上のファイルを管理しているので、プロバイダー内の削除操作をキャンセルできるようにしたいと思います。
私はこれを簡単な解決策で解決しました。
たとえば、を呼び出すたび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()
ます。