AsyncQueryHandler異步操作數(shù)據(jù)庫的使用和源碼解析
來源:程序員人生 發(fā)布時間:2016-09-03 15:45:03 閱讀次數(shù):2974次
1.AsyncQueryHandler的作用:
異步的查詢操作幫助類,它可以處理增刪改查。固然也能夠使用ContentProvider去操作數(shù)據(jù)庫。這在數(shù)據(jù)量很小的時候是沒有問題的,但是如果數(shù)據(jù)量大了,可能致使UI線程產(chǎn)生ANR事件。固然也能夠?qū)憘€Handler去做這些操作,只是每次使用ContentProvider時都要再寫個Handler,必定下降了效力。因此API提供了1個操作數(shù)據(jù)庫的通用方法。它提供:startInsert,startDelete,startUpdate,startQuery這4個操作,并提供相對應(yīng)的onInsertComplete,onDeleteComplete,onUpdateComplete,onQuerytComplete4個方法,以供操作完數(shù)據(jù)庫落后行其它的操作,這4個
onXXXComplete方法都是空實現(xiàn),以便我們只需要去實現(xiàn)我們關(guān)注的操作。
2.AsyncQueryHandler的使用方法:
1.需要繼承AsyncQueryHandler類,并提供onInsertComplete方法的實現(xiàn)(可以實現(xiàn)任何1個或多個,固然也能夠1個也不實現(xiàn),如果你不關(guān)注操作數(shù)據(jù)庫的結(jié)果),在的實現(xiàn)中做1些對數(shù)據(jù)庫操作完成的處理。
2.使用時直接調(diào)用startQuery(或其他4個中的任何1個)方法便可。傳入的通用參數(shù)以下:
token,1個令牌,需要跟onQueryComplete方法傳入的1致。(固然也能夠不1致,一樣在數(shù)據(jù)庫的操作結(jié)束后會調(diào)用對應(yīng)的onQueryComplete方法 )。
cookie,你想傳給onQueryComplete方法使用的1個對象。(沒有的話傳遞null便可)。
Uri uri(進(jìn)行查詢的通用資源標(biāo)志符)。
projection 查詢的列
selection 限制條件
orderBy 排序條件
3.使用處景:
異步操作數(shù)據(jù)庫,在主線程回調(diào)更新ui.
要注意的是,1般在查詢本地的利用的數(shù)據(jù)的時候要去采取CursorAdapter。
4、AsyncQueryHandler內(nèi)部實現(xiàn)
AsyncQueryHandler類封裝了調(diào)用者線程與工作線程的交互進(jìn)程。交互的主體是兩個Handler,1個運行在調(diào)用者線程中,1個運行在工作者線程中。通過提供onXXXComplete的回調(diào)接口,實現(xiàn)事件的完成處理。
API中提供
startInsert,
startDelete,
startUpdate,
startQuery4種方法,并有響應(yīng)的onXXXComplete()方法.于對應(yīng)的4個onXXXComplete()方法都是空實現(xiàn),因此我們完成相應(yīng)調(diào)用落后行后續(xù)其他的操作.
mWorkerThreadHandler是在工作線程中的handler,
AsyncQueryHandler 本身也是個handler,是在主線程中
public abstract class AsyncQueryHandler extends Handler
if (sLooper == null) {
HandlerThread thread = new HandlerThread("AsyncQueryWorker");
thread.start();
sLooper = thread.getLooper();
}
}
mWorkerThreadHandler = createHandler(sLooper);
發(fā)起操作以后,從主線程通過handler拋到工作線程,工作線程在非主線程完成相干
數(shù)據(jù)庫操作,將結(jié)果拋回主線程
5、簡單代碼示例
private void startQuery() {
Uri uri = Sms.CONVESATION_URI;
mQueryHandler.startQuery(0, null, uri, CONVERSATION_PROJECTION, null, null, "sms.date desc");
}
// 寫1個異步查詢類
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);
}
}
歡迎掃描2維碼,關(guān)注公眾號

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈