Launcher中数据的加载流程

承接上一篇文章,当我们进入startLoader方法中,看到最后有这样一行代码

sWorker.post(mLoaderTask);

第一想法是开启了子线程,要执行耗时操作,想想也对加载数据当然是耗时操作要开启子线程。但是别急者去看runnable中的逻辑,先来看看sWorker这个Handler吧。

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

平时我们创建Handler对象就直接new一个了,为什么这个构造要传入一个参数呢,获取的是一个Looper,那这个Looper是哪个线程的Looper呢?再来看看sWorkerThread对象。

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

是一个HandlerThread的类,看HandlerThread的源码是一个Thread的子类,好先到这里,下一篇在具体说说Launcher中我们可以学习的一些设计方式,现在我们只要知道Handler执行了post方法,因为你对应Handler的Looper是在子线程中创建的,所以代码要在子线程中执行post方法参数中Runnable类中的run方法的逻辑。
进入的LoaderTask这个内部类中,直接找到run方法:这其中比较重要的两行代码如下

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

第一行代码是用来加载和显示手机Launcher桌面上的数据,第二行代码是用来加载Launcher中应用菜单列表中的所有的APP数据。这里说的的是原生的安卓应用(模拟器上的Android系统就是原生的),想小米改过的系统就只有一级桌面了,没有了中间的应用菜单列表按钮。先看第一个方法

private boolean loadAndBindWorkspace() {
        ...
        isUpgradePath = loadWorkspace();
        ....
       //第一个参数是负数,表示需要对所有的桌面页进行刷新。如果正数或者0,表示对指定页面进行刷新。
      //第二个参数表示是否需要清理桌面的重复数据。
       bindWorkspace(-1, isUpgradePath);
       ....
}

这个方法中最重要的是这两行代码,第一行,看方法名就知道它是用来加载数据的,第二行是用来讲数据绑定到控件上显示出来的。
loadWorkSpace()当中的逻辑比较多了,在这里就不贴代码了,它主要是从数据库中获取到对应的字段,通过集合传递到bindWorkspace方法中,然后bindWorkspace方法通过回调接口,将数据传递到Launcher中完成数据和控件的绑定来实现数据的展示。

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

同理对于加载应用菜单列表中的应用来说,也是先加载然后绑定这样的逻辑,但是和加载桌面数据不同的是在loadAllApps()方法中没有通过数据库来加载,使用的是PackageManager来获取手机中的所有应用(这里需要说明一下,我的讲解中使用的是Android4.4的Launcher源码来说,在Android5.0中加入了多账户的机制之后,这里就不是使用的PackageManager来实现获取所有应用了,5.0之后就是获取的登录账户的所有应用)。然后onlyBindAllApps()方法就和上面一样了,拿到数据调用回调接口,将数据传递到Launcher中,展示数据。

这就是基本的Launcher的加载逻辑,这里值得要提一下的是,如果想要屏蔽掉应用菜单列表,把所有的应用都加载到桌面上,Google在系统中提供了一个开关,在Hotseat.java这个类中的resetLayout()中有一个if判断,当这个if判断是true的时候就是显示应用菜单按钮,false就是显示应用菜单按钮。

下一篇我们就一起来看看在Launcher中有哪些很好的逻辑实现可以学习的。

欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。

张鹤的公众号
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,057评论 25 707
  • 1. ANR异常 Application No Response:应用程序无响应。在主线程中,是不允许执行耗时的操...
    JackChen1024阅读 1,324评论 0 3
  • 简介 Retrofit 是 Square 推出的 HTTP 框架,主要用于 Android 和 Java。Retr...
    然则阅读 361评论 0 3
  • (1)JSP经编译后就变成了“类servlet”。 (2)JSP由HTML代码和JSP标签构成,更擅长页面显示;S...
    鱼仔_1625阅读 195评论 0 1