AsyncQueryHandler的解释和使用

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

1。AsyncQueryHandler的作用

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

startInsert

startDelete

startUpdate

startQuery

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

 

2。为什么要使用AsyncQueryHandler

当然你也可以使用ContentProvider去操作数据库。

这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR事件。

当然你也可以写个Handler去做这些操作,只是你每次使用ContentProvider时都要再写个Handler,必然降低了效率。

因此API提供了一个操作数据库的通用方法。

 

3。如何使用AsyncQueryHandler

你只需要继承AsyncQueryHandler类,并提供onXXXComplete方法的实现(可以实现任何一个或多个,当然你也可以一个也不实现,如果你不关注操作数据库的结果),在你的实现中做一些对数据库操作完成的处理。

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

int token,一个令牌,需要跟onXXXComplete方法传入的一致。(当然你也可以不一致,同样在数据库的操作结束后会调用对应的onXXXComplete方法 )

Object cookie,你想传给onXXXComplete方法使用的一个对象。(没有的话传递null即可。基本发现这个变量没太大作用)

Uri uri,(不解释)

 

4。AsyncQueryHandler还为我们做了什么

AsyncQueryHandler中使用了一个WeakReference<ContentResolver>对象,即ContentResolver的弱引用  作用:当contentProvied发生变化时候同步更新仍可以通过使用AsyncQueryHandler类来达到这一要求(暂时还没理解这个作用)

同时,在它执行操作数据库时,吃掉了所有的异常。见如下代码。

 catch (Exception e) {
                        Log.w(TAG, e.toString());
                        cursor = null;

                    }

5.在QuickContactBadge里面我们可以看到是通过AsyncQueryHandler来查询Contact的数据。其实我不是第一次看AsyncQueryHandler,但以前看到它,没时间去细细地体味它的用法与好处。反正最近这段时间挺闲的,所以慢慢地体会一些代码。 
只要你在Google或者baidu输入AsyncQueryHandler,就会得到好多链接,可你一打开就知道几乎都是同一篇文章转来转去:http://www.cnblogs.com/duguguiyu/archive/2008/01/24/1050813.html 
其实这位大师已经讲得很清楚明了了,但若是你没有自己动手过去写代码,我想是很难体会理解真正的含义的。我看完了他的文章和API document,我就在想用AsyncQueryHandler和不用它有什么区别呢? 
API document是这样写道的: 
A helper class to help make handling asynchronous ContentResolver queries easier. 
让ContentResolver查询更加容易的帮助类。 

OMG!太简洁凝练的解释了! 
经过我的思考和经验,我总结如下,若有不对的地方,请指正。 
一,若我们不用AsyncQueryHandler,直接在UI 线程调用ContentResolve去操作数据库比如查询,若你的数据库的数据很少还好,若很多,就会出现ANR了。一般解决ANR,就是开thread去解决。我在去年做案子的时候,就遇到这样的情况,数据太多了,我不得不开thread去查询,那开了Thread就得通过Handler来和UI线程交互,让UI线程知道何时查询完毕,可以更新UI将查询的结果表现出来。 
二,若我们用AsyncQueryHandler,AsyncQueryHandler它就会主动地帮你开了Thread来避免ANR,并且它是继承于Handler,所以就可以通过onCompleteQuery来通知UI线程已经查询(删除...)完了。 
所以这两种的区别在于工作是你自己写代码来做,还是调用现成的啦!^_^ 
也就是那位大师最后讲的那段话了。 
至于Async异步,异步就是 大家一起上公交车 不排队。同步就是 大家排队上公交车, 一个一个上,一次只能上一个。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章