AsyncQueryHandler簡介:
非同步查詢操作協助類,可以處理增刪改(ContentProvider提供的資料)
使用情境:
在一般的應用中可以使用ContentProvider去操作資料庫。
這在資料量很小的時候是沒有問題的,但是如果資料量大了,可能導致UI線程發生ANR異常(超過5秒)。
當然你也可以寫個Handler去做這些操作,只是你每次使用ContentProvider時都要再寫個Handler,必然降低了效率。
因此當資料量較大時,最好還是使用Android已經封裝好的非同步查詢方塊架AsyncQueryHandler,最佳化我們的代碼.
要注意的是,一般在查詢本地的應用的資料的時候要去採用CursorAdapter。
AsyncQueryHandler內部實現
AsyncQueryHandler類封裝了調用者線程與背景工作執行緒的互動過程。互動的主體是兩個Handler,一個運行在調用者線程中,一個運行在工作者線程中。通過提供onXXXComplete的回調介面,實現事件的完成處理。
API中提供
startInsert,
startDelete,
startUpdate,
startQuery四種方法,並有響應的onXXXComplete()方法.於對應的4個onXXXComplete()方法都是空實現,因此我們完成相應調用後進行後續其他的操作.
使用方法
繼承AsyncQueryHandler類,並提供onXXXComplete方法的實現(可以實現任何一個或多個,當然你也可以一個也不實現,如果你不關注操作資料庫的結果),在你的實現中做一些對資料庫操作完成的處理。
使用時直接調用startXXX方法即可。傳入的通用參數如下:
token,一個令牌,主要用來標識查詢,保證唯一即可.需要跟onXXXComplete方法傳入的一致。(當然你也可以不一致,同樣在資料庫的操作結束後會調用對應的onXXXComplete方法 )
cookie,你想傳給onXXXComplete方法使用的一個對象。(沒有的話傳遞null即可)
Uri uri(進行查詢的通用資源標誌符):
projection 查詢的列
selection 限制條件
selectionArgs 查詢參數
orderBy 排序條件
private void startQuery() { Uri uri = Sms.CONVESATION_URI; mQueryHandler.startQuery(0, null, uri, CONVERSATION_PROJECTION, null, null, "sms.date desc"); } // 寫一個非同步查詢類 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); } }