Theme 切换

给用户的感觉是启动变快了,实际上app启动时间没有改变。theme切换就是app刚打开的时候的闪屏页。就是APP冷启动的时候的空白window。

具体做法有三步,如下:

启动优化--异步优化

核心思想:子线程分担主线程任务,并行减少时间。(手机CPU大多是多核的,一个线程只占用一个核心,这样CPU的资源没有利用)

异步优化,分为 : 常规异步优化  和 最优异步优化 两种

常规异步优化

经验:
(1)采用线程池的方法,线程的个数按照CPU的个数来;
(2)并不是每个Application.onCreate()中的语句都需要放在线程池中。比如有的方法里含有“Handler handler = new Handler();”语句,这样的语句在子线程中是不能执行的,因为没有对应的MessageQueue,解决办法是添加Looper,比如“ Handler handler = new Handler(Looper.getMainLooper()); ”
(3)还有一种情况,就是方法必须在Application.onCreate()语句执行完之前,这种也不能丢在线程池中。解决办法是用“ CountDownLatch ”。步骤如下:

(a)定义: private CountDownLatch mCountDownLatch = new CountDownLatch(1);

(b)条件被满足之后的地方使用:mCountDownLatch.countDown();

(c)需要等待条件执行完的地方:mCountDownLatch.await();

// 主要代码://线程池public void threadPool(){ExecutorService service =Executors.newFixedThreadPool(CORE_POOL_SIZE);service.submit(new Runnable() {@Overridepublic void run() {FirstTask.onStart();}});service.submit(new Runnable() {@Overridepublic void run() {SecondTask.onStart();// 这个先执行,才执行await()之后的方法。mCountDownLatch.countDown();}});service.submit(new Runnable() {@Overridepublic void run() {ThirdTask.onStart();}});// 等待try {mCountDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}}

痛点:
(1)代码不优化
(2)场景不好处理(子任务中有依赖关系)
(3)维护成本高

最优异步优化--启动器

核心思想:充分利用CPU多核,自动梳理任务顺序

启动器流程:
(1)代码Task化,启动逻辑抽象为Task
(2)根据所有任务依赖关系排序生成一个有向无环图
(3)多线程按照排序后的优先级依次执行

实操:

第一步,继承 Task 类,添加需要执行的任务

// (1)需要执行的任务放在,继承Task的类中,的run()方法中。
// (2)也可以继承 MainTask 类,表示执行的是在主线程中public class InitSecondTask extends Task {//表示:这个任务需要等待它执行完@Overridepublic boolean needWait() {return true;}@Overridepublic void run() {//真正我们自己的任务SecondTask.onStart();}
}/*** 需要在IntiSleepTask之后执行*/
public class InitThirdTask extends Task {// 一个任务依赖另一个任务@Overridepublic List<Class<? extends Task>> dependsOn() {List<Class<? extends Task>> task = new ArrayList<>();task.add(InitSleepTask.class);return task;}@Overridepublic void run() {ThirdTask.onStart();}
}

第二部,启动启动器。

// 将下面的代码放在 Application.onCrate() 的方法体中。// 启动器方法启动public void launcherInit(){// 启动器TaskDispatcher.init(MyApplication.this);TaskDispatcher dispatcher = TaskDispatcher.createInstance();dispatcher.addTask(new InitFirstTask()).addTask(new InitSecondTask()).addTask(new InitThirdTask()).addTask(new InitSleepTask()).start();dispatcher.await();  // 启动器等待}

Android启动优化--异步优化相关推荐

  1. android布局优化方案,Android启动优化-布局优化

    Android启动优化-布局优化 安卓应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的情况看,安卓开发还是一个热火朝天的发展,但高级人才却相对较少,如今移动互联网的开发者也逐渐开始注重插入 ...

  2. android 启动页_App启动优化一顿操作猛如虎

    前言 本次主要内容包括: 针对App启动优化我们做了哪些工作? 1.App启动优化方向:视觉体验优化 2.App启动优化方向:代码逻辑优化 一.App启动优化方向:视觉体验优化 App启动时白屏问题 ...

  3. Android 启动优化(五)- AnchorTask 1.0.0 版本正式发布了

    今天,更新一下 Android 启动优化有向无环图系列的最后一篇文章.最近一段时间,暂时不会更新这方面的文章了.系列文章汇总如下: Android 启动优化(一) - 有向无环图 Android 启动 ...

  4. 深入探索Android 启动优化(七) - JetPack App Startup 使用及源码浅析

    本文首发我的微信公众号:徐公,想成为一名优秀的 Android 开发者,需要一份完备的 知识体系,在这里,让我们一起成长,变得更好~. 前言 前一阵子,写了几篇 Android 启动优化的文章,主要是 ...

  5. 启动优化·基础论·浅析 Android 启动优化

    " [小木箱成长营]启动优化系列文章(排期中): 启动优化 · 工具论 · 启动优化常见的六种工具 启动优化 · 方法论 · 这样做启动优化时长降低 70% 启动优化 · 实战论 · 手把手 ...

  6. Android 启动优化(一) - 有向无环图

    前言 说到 Android 启动优化,大家第一时间可能会想到异步加载.将耗时任务放到子线程加载,等到所有加载任务加载完成之后,再进入首页. 多线程异步加载方案确实是 ok 的.但如果遇到前后依赖的关系 ...

  7. Android启动优化实战(有效降低APP启动时间)

    1.概述 手机点击一个APP,用户希望应用能够及时响应并快速加载.启动时间过长的应用不能满足这个期望,并且可能会令用户失望.这种糟糕的体验可能会导致用户在 Play 商店针对您的应用给出很低的评分,甚 ...

  8. 【转】Android APP 启动黑屏优化补丁 (2016-01-18 10:35:23)

    [转]Android APP 启动黑屏优化补丁 (2016-01-18 10:35:23) 转载▼ 这个必须转,这才是高手,解决官方都解决不好的问题! 原文地址,以下为转贴内容: 使用说明 ***** ...

  9. Android启动优化方案调研

    /   今日科技快讯   / 7月21日,国家互联网信息办公室依据<网络安全法><数据安全法><个人信息保护法><行政处罚法>等法律法规,对滴滴全球股份 ...

  10. Android启动界面优化技巧-Splash Screens的正确方式

    备注:这里是开发跨平台App时,适配Android启动屏幕,主要为了防止白屏.玩Android开源App 往往我们在开发Android的时候会出现白屏等等,主要原因就是启动时需要加载的资源过多,从而影 ...

最新文章

  1. 有关博弈人机混合智能的再思考
  2. android edittext设置内容为空,android – 我将EditText的InputType设置为TYPE_NULL后无法更改...
  3. 地图中添加沿线文字标注
  4. python列表操作符_python——列表操作符
  5. Mybatis 批量操作总结
  6. Redis 6.0.0 GA
  7. 微课|中学生可以这样学Python(例3.2):今天是今年的第几天
  8. c语言图像压缩算法实现_kakadu——JPEG2000图像压缩软件的安装和使用
  9. docker容器别人访问很卡_一篇文章带你走进Docker的世界
  10. 游戏音效是用什么软件做的?
  11. PHP实现 鸡兔同笼的问题
  12. errorreporting php,php-phpin的error_reporting 22527中的22527是什么
  13. 怎么提取pdf中的表格数据_如何从pdf第1部分中提取表格数据
  14. iFunk超极本或出新,你最想知道什么
  15. 关于信息安全风险评估,你需要知道的
  16. 求生之路怎么显示所有服务器,求生之路2怎么屏蔽rpg服务器 求生之路2屏蔽rpg服务器方法_游侠网...
  17. ESP8266Wi-Fi数据通讯
  18. 图像主结构的提取方法
  19. uni-app返回上一层页面后数据刷新重置解决办法,uni-app页面不刷新,强制刷新页面方法!
  20. Linux链路捆绑的两种方法

热门文章

  1. 如何取消PPT的密码保护?
  2. mpeg格式转换成mp4,mpeg转mp4
  3. Win7 文件加密存储操作后,如何在事后备份证书、秘钥
  4. 关闭Win10自动更新
  5. 手动打开与关闭软键盘
  6. 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)
  7. 计算机桌面机器人,桌面的 Spirit Rover(勇气号探测器),机器人爱好者的心头好!!...
  8. 深信服负载均衡开发实习面经
  9. 《tkinter实用教程二》tkinter的子模块ttk
  10. 网络学习 2g 3g 4g 5g技术对比