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

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