AsyncQueryHandler异步操作数据库的使用和源码解析

Posted robert_chao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AsyncQueryHandler异步操作数据库的使用和源码解析相关的知识,希望对你有一定的参考价值。

一.AsyncQueryHandler的作用:

异步的查询操作帮助类,它可以处理增删改查。当然也可以使用ContentProvider去操作数据库。这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR事件。当然也可以写个Handler去做这些操作,只是每次使用ContentProvider时都要再写个Handler,必然降低了效率。因此API提供了一个操作数据库的通用方法。它提供:startInsert,startDelete,startUpdate,startQuery这四个操作,并提供相对应的onInsertComplete,onDeleteComplete,onUpdateComplete,onQuerytComplete四个方法,以供操作完数据库后进行其它的操作,这四个 onXXXComplete方法都是空实现,以便我们只需要去实现我们关注的操作。
 

二.AsyncQueryHandler的使用方法:

1.需要继承AsyncQueryHandler类,并提供onInsertComplete方法的实现(可以实现任何一个或多个,当然也可以一个也不实现,如果你不关注操作数据库的結果),在的实现中做一些对数据库操作完成的处理。
2.使用时直接调用startQuery(或者其他四个中的任何一个)方法即可。传入的通用参数如下:
token,一个令牌,需要跟onQueryComplete方法传入的一致。(当然也可以不一致,同样在数据库的操作结束后会调用对应的onQueryComplete方法 )。
cookie,你想传给onQueryComplete方法使用的一个对象。(没有的话传递null即可)。
Uri uri(进行查询的通用资源标志符)。
projection 查询的列
selection  限制条件
orderBy 排序条件

三.使用场景:

异步操作数据库,在主线程回调更新ui.
要注意的是,一般在查询本地的应用的数据的时候要去采用CursorAdapter。


四、AsyncQueryHandler内部实现

AsyncQueryHandler类封装了调用者线程与工作线程的交互过程。交互的主体是两个Handler,一个运行在调用者线程中,一个运行在工作者线程中。通过提供onXXXComplete的回调接口,实现事件的完成处理。
API中提供
startInsert,
startDelete,
startUpdate,
startQuery四种方法,并有响应的onXXXComplete()方法.于对应的4个onXXXComplete()方法都是空实现,因此我们完成相应调用后进行后续其他的操作. 

mWorkerThreadHandler是在工作线程中的handler,

AsyncQueryHandler 本身也是个handler,是在主线程中

public abstract class AsyncQueryHandler extends Handler 

if (sLooper == null) {
        HandlerThread thread = new HandlerThread("AsyncQueryWorker");
        thread.start();
        sLooper = thread.getLooper();
   }
}
mWorkerThreadHandler = createHandler(sLooper);

发起操作之后,从主线程通过handler抛到工作线程,工作线程在非主线程完成相关数据库操作,将结果抛回主线程


五、简单代码示例

 private void startQuery() {


        Uri uri = Sms.CONVESATION_URI;


        mQueryHandler.startQuery(0, null, uri, CONVERSATION_PROJECTION, null, null, "sms.date desc");


    }


    // 写一个异步查询类  


private final class QueryHandler extends AsyncQueryHandler {


        public QueryHandler(ContentResolver cr) {


            super(cr);


        }
        
        @Override
        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {


            super.onQueryComplete(token, cookie, cursor);


            // 更新mAdapter的Cursor  


            mAdapter.changeCursor(cursor);


        }


}
 


以上是关于AsyncQueryHandler异步操作数据库的使用和源码解析的主要内容,如果未能解决你的问题,请参考以下文章

Handler研究2-AsyncTask,AsyncQueryHandler分析

tornado数据库操作怎么异步

在tornado中使用异步mysql操作

Perl的web框架Mojolicious与异步数据库操作

使同步数据库操作异步

封装提取异步操作的API---数据操作模块