国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > AsyncQueryHandler异步操作数据库的使用和源码解析

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

来源:程序员人生   发布时间:2016-09-03 15:45:03 阅读次数:2727次

1.AsyncQueryHandler的作用:

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

2.AsyncQueryHandler的使用方法:

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

3.使用处景:

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


4、AsyncQueryHandler内部实现

AsyncQueryHandler类封装了调用者线程与工作线程的交互进程。交互的主体是两个Handler,1个运行在调用者线程中,1个运行在工作者线程中。通过提供onXXXComplete的回调接口,实现事件的完成处理。
API中提供
startInsert,
startDelete,
startUpdate,
startQuery4种方法,并有响应的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抛到工作线程,工作线程在非主线程完成相干数据库操作,将结果抛回主线程


5、简单代码示例

private void startQuery() { Uri uri = Sms.CONVESATION_URI; mQueryHandler.startQuery(0, null, uri, CONVERSATION_PROJECTION, null, null, "sms.date desc"); } // 写1个异步查询类 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); } }




欢迎扫描2维码,关注公众号



生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生