這篇文章將為大家詳細講解有關(guān)android開發(fā)中使用Handler怎么實現(xiàn)預(yù)加載功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
在進行Android客戶端界面開發(fā)時,我們常常會需要將從服務(wù)端獲取的數(shù)據(jù)展示到頁面布局上,由于數(shù)據(jù)顯示到布局的前置條件是頁面布局已初始化完成,否則會出現(xiàn)空指針異常,所以一般我們需要將網(wǎng)絡(luò)請求放在布局初始化完成之后。
傳統(tǒng)的頁面加載流程是:
問題:
如果加載的UI布局比較復(fù)雜,或者初始化邏輯執(zhí)行的時間比較多,那么網(wǎng)絡(luò)請求開始執(zhí)行的時間就比較晚,最終完成頁面加載的時間就比較長。
如果頁面初始化和網(wǎng)絡(luò)加載能同時進行,等兩者都執(zhí)行結(jié)束后,再在布局上展示網(wǎng)絡(luò)數(shù)據(jù),這樣我們就可以縮短整個頁面的加載時間了。
所以,我們期望的頁面加載流程是:
這個流程我們稱之為:預(yù)加載
預(yù)加載的目標任務(wù)可以是一個網(wǎng)絡(luò)請求,也可以是其它一些耗時操作,例如:加載一張圖片到控件上展示
在實現(xiàn)預(yù)加載方案之前,我們需要了解一下Handler工作機制中的SyncBarrier概念,對Barrier概念了解可以看這篇文章中對“同步分割欄”的介紹, 此處我們簡單理解為:
在MessageQueue中添加一個特殊的msg,將這個msg作為一個標記,在這個標記被移除之前,當前MessageQueue隊列中排在它后面的其它(非async) 的message不會被handler處理。
我們可以先不理會什么是 非async 的message,若需要了解更多,這篇文章中對“同步分割欄”的介紹中也有相關(guān)介紹。
利用這個特性,我們可以:
啟動一個HandlerThread來異步執(zhí)行網(wǎng)絡(luò)請求
設(shè)置一個標記SyncBarrier,此后在message將一直在messageQueue中不被執(zhí)行
網(wǎng)絡(luò)請求成功后,post一個任務(wù)來執(zhí)行展示數(shù)據(jù)
布局初始化成功后,移除SyncBarrier
將展示數(shù)據(jù)的任務(wù)post到ui線程來執(zhí)行
步驟3和步驟4的先后順序可以交換
其中,在android api 22及之前,設(shè)置標記SyncBarrier可以由
HandlerThread.getLooper().postSyncBarrier();
在android api 23以后,需要調(diào)用的方法為:
HandlerThread.getLooper().getQueue().postSyncBarrier();
同樣的,移除標記的方法分別為:
HandlerThread.getLooper().removeSyncBarrier(token); HandlerThread.getLooper().getQueue().removeSyncBarrier(token);
名稱欄目:android開發(fā)中使用Handler怎么實現(xiàn)預(yù)加載功能-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://www.chinadenli.net/article44/dsdcee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站內(nèi)鏈、服務(wù)器托管、用戶體驗、網(wǎng)站制作、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容