Android 異步任務知識梳理(3) - AsyncQueryHandler 源碼解析

一殴胧、概述

AsyncQueryHandler方便了我們對ContentProvider進行增渗稍、刪、改团滥、查竿屹,此外,我們通過學習它的原理可以更好地理解HandlerThread灸姊,學習如何在項目中使用它拱燃。

二、源碼

AsyncQueryHandler中的關(guān)鍵是mWorkerThreadHandler力惯,它在其handleMessage中進行操作碗誉,因為它在構(gòu)造時傳入的Looper所關(guān)聯(lián)的Thread并不是主線程,因此所有在handleMessage中的操作都是異步的父晶,這個變量的初始化時在其構(gòu)造函數(shù)中:

public AsyncQueryHandler(ContentResolver cr) {    
    super();    
    mResolver = new WeakReference<ContentResolver>(cr);    
    synchronized (AsyncQueryHandler.class) {        
        if (sLooper == null) {            
            HandlerThread thread = new HandlerThread("AsyncQueryWorker");            
            thread.start();            
            sLooper = thread.getLooper();        
        }    
    }    
    mWorkerThreadHandler = createHandler(sLooper);
}

protected Handler createHandler(Looper looper) {    
    return new WorkerHandler(looper);
}

可以看到sLooper只有在第一次實例化AsyncQueryHandler才會生成哮缺,因此當我們采用默認實現(xiàn)時,并且在多個地方實例化不同的AsyncQueryHandler對象甲喝,每個對象對應的是不同的WorkerHandler尝苇,但是 WorkerHandler關(guān)聯(lián)到的是同一個Looper,我們通過它執(zhí)行的所有任務是放在一個隊列當中順序執(zhí)行的。如果我們不希望運行在默認的Looper中茎匠,那么也可以通過重寫createHandler來傳入一個另外的 Looper格仲。因為AsyncQueueHandler的增、刪诵冒、改凯肋、查的原理都是相同的,因此我們單獨看一下增加的操作汽馋,就可以理解它的思想了:

public final void startInsert(int token, Object cookie, Uri uri, ContentValues initialValues) {     
    Message msg = mWorkerThreadHandler.obtainMessage(token);    
    msg.arg1 = EVENT_ARG_INSERT;    
    WorkerArgs args = new WorkerArgs();    
    args.handler = this;    
    args.uri = uri;    
    args.cookie = cookie;    
    args.values = initialValues;    
    msg.obj = args;    
    mWorkerThreadHandler.sendMessage(msg);
}

protected class WorkerHandler extends Handler {    
    public WorkerHandler(Looper looper) {         
        super(looper);    
    }
    public void handleMessage(Message msg) {
        final ContentResolver resolver = mResolver.get();
        if (resolver == null) return;
        WorkerArgs args = (WorkerArgs) msg.obj;
          int token = msg.what;
          int event = msg.arg1;
          switch (event) {
              case EVENT_ARG_INSERT:    
                  args.result = resolver.insert(args.uri, args.values);    
                  break;
          }
          Message reply = args.handler.obtainMessage(token);
          reply.obj = args;
          reply.arg1 = msg.arg1;
          reply.sendToTarget();
    }
}

@Override
public void handleMessage(Message msg) {    
    WorkerArgs args = (WorkerArgs) msg.obj;
    int token = msg.what;
    int event = msg.arg1;
    switch (event) {
        case EVENT_ARG_INSERT:    
            onInsertComplete(token, args.cookie, (Uri) args.result);    
            break;
    }
}

當我們調(diào)用了插入方法之后侮东,整個過程如下:

  • mWorkerThreadHandler發(fā)送一條消息,該消息當中帶有插入相關(guān)的所有參數(shù)以及AsyncQueryHandler子類的實例豹芯。
  • mWorkderThreadHanlderhandleMessage中悄雅,它調(diào)用ContentResolver的對應插入方法進行插入,它和mWorkderThreadHandler關(guān)聯(lián)的Looper是運行在同一個線程當中的铁蹈。
  • 插入完畢之后宽闲,通過消息當中傳入的AsyncQueryHandler子類的實例將執(zhí)行的結(jié)果發(fā)送回去,在其AsyncQueryHandlerhandleMessage(Message message)方法中握牧,回調(diào)抽象方法onInsertComplete(token, args.cookie, (Uri) args.result)容诬,子類通過實現(xiàn)該方法來獲取執(zhí)行的結(jié)果。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沿腰,一起剝皮案震驚了整個濱河市览徒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颂龙,老刑警劉巖习蓬,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異措嵌,居然都是意外死亡躲叼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門铅匹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來押赊,“玉大人,你說我怎么就攤上這事包斑。” “怎么了涕俗?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵罗丰,是天一觀的道長。 經(jīng)常有香客問我再姑,道長萌抵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮绍填,結(jié)果婚禮上霎桅,老公的妹妹穿的比我還像新娘。我一直安慰自己讨永,他們只是感情好滔驶,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卿闹,像睡著了一般揭糕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锻霎,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天著角,我揣著相機與錄音,去河邊找鬼旋恼。 笑死吏口,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的冰更。 我是一名探鬼主播产徊,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冬殃!你這毒婦竟也來了囚痴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤审葬,失蹤者是張志新(化名)和其女友劉穎深滚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涣觉,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡痴荐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了官册。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片生兆。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖膝宁,靈堂內(nèi)的尸體忽然破棺而出鸦难,到底是詐尸還是另有隱情,我是刑警寧澤员淫,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布合蔽,位于F島的核電站,受9級特大地震影響介返,放射性物質(zhì)發(fā)生泄漏拴事。R本人自食惡果不足惜沃斤,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刃宵。 院中可真熱鬧衡瓶,春花似錦、人聲如沸牲证。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽从隆。三九已至诚撵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間键闺,已是汗流浹背寿烟。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辛燥,地道東北人筛武。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像挎塌,于是被迫代替她去往敵國和親徘六。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容