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異步,異步就是 大家一起上公交車 不排隊。同步就是 大家排隊上公交車, 一個一個上,一次只能上一個。


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