android AsyncQueryHandler详解

本文介绍了AsyncQueryHandler类如何简化ContentResolver在UI线程中进行数据库查询操作,避免ANR问题,并通过onXXXComplete方法通知UI线程查询完成。通过使用AsyncQueryHandler,开发者只需调用startXXX方法并配置所需参数,即可实现查询、删除、更新等数据库操作,同时利用Handler简化了与UI线程的交互。
摘要由CSDN通过智能技术生成

转至:http://blog.csdn.net/jason0539/article/details/9840603

官方文档对AsyncQueryHandler的解释非常简洁

A helper class to help make handling asynchronousContentResolver queries easier

下面解释一番,其实明白之后就会发现,真的就是一句话的事情而已.

AsyncQueryHandler:异步的查询操作帮助类,其实它同样可以处理增删改,

查询其API便可知,它担供:

startInsert()

startDelete()

startUpdate()

startQuery()

这四个操作,并提供相对应的onXXXComplete方法,以供操作完数据库后进行其它的操作,这四个onXXXComplete方法都是空实现,以便我们只需要去实现我们关注的操作。

如题所说,让ContentResolver的查询操作更简单,

首先,若我们不用AsyncQueryHandler,那么,在UI 线程调用ContentResolve去操作数据库,比如查询,若你的数据库的数据很少还好,若很多,就会出现ANR了。一般解决ANR,就是开thread去解决。然后呢,既然开了新的Thread,就得通过Handler来和UI线程交互,也就是查询完之后通过Handler发一个message通知主线程去更新UI.这一系列的操作其实还是挺繁琐的.

所以,A helper class to help make handling asynchronousContentResolver queries easier

那么,若我们用AsyncQueryHandler怎样做呢,AsyncQueryHandler它就会主动地帮你开了Thread来避免ANR,并且它是继承于Handler,所以就可以通过onCompleteQuery来通知UI线程已经查询(删除,更新,增加)完成。 

所以,这两种实现方式的区别在于,工作是你自己写代码来做,还是调用现成的.

 

使用时直接调用startXXX方法即可。传入的通用参数如下:

token,一个令牌,主要用来标识查询,保证唯一即可.需要跟onXXXComplete方法传入的一致。(当然你也可以不一致,同样在数据库的操作结束后会调用对应的onXXXComplete方法 )

cookie,你想传给onXXXComplete方法使用的一个对象。(没有的话传递null即可)

Uri uri(进行查询的通用资源标志符):

projection 查询的列 

selection  限制条件 

selectionArgs 查询参数

orderBy 排序条件

 

  1. private void startQuery() {    
  2.     
  3.         Uri uri = Sms.CONVESATION_URI;    
  4.     
  5.         mQueryHandler.startQuery(0null, uri, CONVERSATION_PROJECTION, nullnull"sms.date desc");    
  6.     
  7.     }    
  8.     
  9.     // 写一个异步查询类    
  10.     
  11.     private final class QueryHandler extends AsyncQueryHandler {    
  12.     
  13.         public QueryHandler(ContentResolver cr) {    
  14.     
  15.             super(cr);    
  16.     
  17.         }    
  18.     
  19.      
  20.     
  21.         @Override    
  22.     
  23.         protected void onQueryComplete(int token, Object cookie, Cursor cursor) {    
  24.     
  25.             super.onQueryComplete(token, cookie, cursor);    
  26.     
  27.             // 更新mAdapter的Cursor    
  28.     
  29.             mAdapter.changeCursor(cursor);    
  30.     
  31.         }    
  32.     
  33.     }    

更详细代码实现参考http://blog.csdn.net/hudashi/article/details/6896356


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值