Launcher中數(shù)據(jù)的加載流程

承接上一篇文章驳糯,當(dāng)我們進入startLoader方法中,看到最后有這樣一行代碼

sWorker.post(mLoaderTask);

第一想法是開啟了子線程介蛉,要執(zhí)行耗時操作,想想也對加載數(shù)據(jù)當(dāng)然是耗時操作要開啟子線程斥扛。但是別急者去看runnable中的邏輯,先來看看sWorker這個Handler吧丹锹。

private static final Handler sWorker = new Handler(sWorkerThread.getLooper());

平時我們創(chuàng)建Handler對象就直接new一個了犹赖,為什么這個構(gòu)造要傳入一個參數(shù)呢,獲取的是一個Looper卷仑,那這個Looper是哪個線程的Looper呢峻村?再來看看sWorkerThread對象。

private static final HandlerThread sWorkerThread = new HandlerThread("launcher-loader");

是一個HandlerThread的類锡凝,看HandlerThread的源碼是一個Thread的子類粘昨,好先到這里,下一篇在具體說說Launcher中我們可以學(xué)習(xí)的一些設(shè)計方式窜锯,現(xiàn)在我們只要知道Handler執(zhí)行了post方法张肾,因為你對應(yīng)Handler的Looper是在子線程中創(chuàng)建的,所以代碼要在子線程中執(zhí)行post方法參數(shù)中Runnable類中的run方法的邏輯锚扎。
進入的LoaderTask這個內(nèi)部類中吞瞪,直接找到run方法:這其中比較重要的兩行代碼如下

....
isUpgrade = loadAndBindWorkspace();
...
loadAndBindAllApps();

第一行代碼是用來加載和顯示手機Launcher桌面上的數(shù)據(jù),第二行代碼是用來加載Launcher中應(yīng)用菜單列表中的所有的APP數(shù)據(jù)驾孔。這里說的的是原生的安卓應(yīng)用(模擬器上的Android系統(tǒng)就是原生的)芍秆,想小米改過的系統(tǒng)就只有一級桌面了,沒有了中間的應(yīng)用菜單列表按鈕翠勉。先看第一個方法

private boolean loadAndBindWorkspace() {
        ...
        isUpgradePath = loadWorkspace();
        ....
       //第一個參數(shù)是負數(shù)妖啥,表示需要對所有的桌面頁進行刷新。如果正數(shù)或者0对碌,表示對指定頁面進行刷新荆虱。
      //第二個參數(shù)表示是否需要清理桌面的重復(fù)數(shù)據(jù)。
       bindWorkspace(-1, isUpgradePath);
       ....
}

這個方法中最重要的是這兩行代碼朽们,第一行怀读,看方法名就知道它是用來加載數(shù)據(jù)的,第二行是用來講數(shù)據(jù)綁定到控件上顯示出來的骑脱。
loadWorkSpace()當(dāng)中的邏輯比較多了菜枷,在這里就不貼代碼了,它主要是從數(shù)據(jù)庫中獲取到對應(yīng)的字段惜姐,通過集合傳遞到bindWorkspace方法中犁跪,然后bindWorkspace方法通過回調(diào)接口椿息,將數(shù)據(jù)傳遞到Launcher中完成數(shù)據(jù)和控件的綁定來實現(xiàn)數(shù)據(jù)的展示歹袁。

private void loadAndBindAllApps() {
      ....
      loadAllApps();
      ....
      onlyBindAllApps();
}

同理對于加載應(yīng)用菜單列表中的應(yīng)用來說坷衍,也是先加載然后綁定這樣的邏輯,但是和加載桌面數(shù)據(jù)不同的是在loadAllApps()方法中沒有通過數(shù)據(jù)庫來加載条舔,使用的是PackageManager來獲取手機中的所有應(yīng)用(這里需要說明一下枫耳,我的講解中使用的是Android4.4的Launcher源碼來說,在Android5.0中加入了多賬戶的機制之后孟抗,這里就不是使用的PackageManager來實現(xiàn)獲取所有應(yīng)用了迁杨,5.0之后就是獲取的登錄賬戶的所有應(yīng)用)。然后onlyBindAllApps()方法就和上面一樣了凄硼,拿到數(shù)據(jù)調(diào)用回調(diào)接口铅协,將數(shù)據(jù)傳遞到Launcher中,展示數(shù)據(jù)摊沉。

這就是基本的Launcher的加載邏輯狐史,這里值得要提一下的是,如果想要屏蔽掉應(yīng)用菜單列表说墨,把所有的應(yīng)用都加載到桌面上骏全,Google在系統(tǒng)中提供了一個開關(guān),在Hotseat.java這個類中的resetLayout()中有一個if判斷尼斧,當(dāng)這個if判斷是true的時候就是顯示應(yīng)用菜單按鈕姜贡,false就是顯示應(yīng)用菜單按鈕。

下一篇我們就一起來看看在Launcher中有哪些很好的邏輯實現(xiàn)可以學(xué)習(xí)的棺棵。

歡迎關(guān)注我的微信公眾號楼咳,我會把一些生活的感想和投資方面的總結(jié)寫到公眾號,希望你能來和我一起交流技術(shù)之外的東西烛恤。

張鶴的公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爬橡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棒动,更是在濱河造成了極大的恐慌糙申,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件船惨,死亡現(xiàn)場離奇詭異柜裸,居然都是意外死亡,警方通過查閱死者的電腦和手機粱锐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門疙挺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怜浅,你說我怎么就攤上這事铐然∈弑溃” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵搀暑,是天一觀的道長沥阳。 經(jīng)常有香客問我,道長自点,這世上最難降的妖魔是什么桐罕? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮桂敛,結(jié)果婚禮上功炮,老公的妹妹穿的比我還像新娘。我一直安慰自己术唬,他們只是感情好薪伏,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粗仓,像睡著了一般嫁怀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潦牛,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天眶掌,我揣著相機與錄音,去河邊找鬼巴碗。 笑死朴爬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的橡淆。 我是一名探鬼主播召噩,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逸爵!你這毒婦竟也來了具滴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤师倔,失蹤者是張志新(化名)和其女友劉穎构韵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趋艘,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡疲恢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓷胧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片显拳。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搓萧,靈堂內(nèi)的尸體忽然破棺而出杂数,到底是詐尸還是另有隱情宛畦,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布揍移,位于F島的核電站次和,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏羊精。R本人自食惡果不足惜斯够,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一囚玫、第九天 我趴在偏房一處隱蔽的房頂上張望喧锦。 院中可真熱鬧,春花似錦抓督、人聲如沸燃少。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阵具。三九已至,卻和暖如春定铜,著一層夾襖步出監(jiān)牢的瞬間阳液,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工揣炕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帘皿,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓畸陡,卻偏偏與公主長得像鹰溜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丁恭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,318評論 25 707
  • 1. ANR異常 Application No Response:應(yīng)用程序無響應(yīng)曹动。在主線程中,是不允許執(zhí)行耗時的操...
    JackChen1024閱讀 1,401評論 0 3
  • 簡介 Retrofit 是 Square 推出的 HTTP 框架牲览,主要用于 Android 和 Java墓陈。Retr...
    然則閱讀 368評論 0 3
  • (1)JSP經(jīng)編譯后就變成了“類servlet”。 (2)JSP由HTML代碼和JSP標(biāo)簽構(gòu)成第献,更擅長頁面顯示贡必;S...
    魚仔_1625閱讀 201評論 0 1