AsyncQueryHandlerを使ってクエリを非同期実行する場合に、実行したクエリがディスク
フル等による要因でエラーとなることがあります。
クライアント側でこれを受け取る方法としてAsyncQueryHandler.WorkerHandlerが提供さ
れています。
下記はそのサンプルソースです。
private QueryHandler query; @Override protected void onResume() { super.onResume(); query = new QueryHandler(this); query.startQuery(10, null, Browser.BOOKMARKS_URI, new String[] {"_id"}, null, null, null); } private static class QueryHandler extends AsyncQueryHandler { public QueryHandler(Context context) { super(context.getContentResolver()); } private class ErrorHandler extends AsyncQueryHandler.WorkerHandler { public ErrorHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { try { super.handleMessage(msg); } catch (Exception e) { // do something. } } @Override protected Handler createHandler(Looper looper) { return new ErrorHandler(looper); } @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { DatabaseUtils.dumpCursor(cursor); } }
AsyncQueryHandlerでのクエリ実行は、AsyncQueryHandlerに内包されているHandlerThread
上で行われます。
このHandlerThreadのLooperはWorkerHandlerと紐付けられており、WorkerHandler.handleMessage
でクエリの問合せが行われます。
WorkerHandlerはAsyncTaskQuery.createHandler(Looper)で生成されるHandlerインスタン
スとなります。
createHandlerメソッドはpublicとなっており、サブクラスがこれをオーバーライドする
ことで、独自のWorkerHandlerを定義することが可能です。
先ほどの例では、ErrorHAndlerのhandleMessage内で呼び出されるsuper.handleMessage(msg);
内でクエリが問合せされます。
ここでtry-catch節を組むことで、WorkerHandlerが発行するクエリの例外を拾えるという
仕組みです。
# 実際catchする例外はExceptionではなくSQLiteDiskIOExceptionやSQLiteFullExceptionに
# なるでしょう。
以上です。