AsyncQueryHandler:異步的查詢操作幫助類,其實它同樣可以處理增刪改
1。AsyncQueryHandler的作用
查詢其API便可知,它擔供:
這四個操作,並提供相對應的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異步,異步就是 大家一起上公交車 不排隊。同步就是
大家排隊上公交車, 一個一個上,一次只能上一個。