Android启动优化--异步优化
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启动优化--异步优化相关推荐
- android布局优化方案,Android启动优化-布局优化
Android启动优化-布局优化 安卓应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的情况看,安卓开发还是一个热火朝天的发展,但高级人才却相对较少,如今移动互联网的开发者也逐渐开始注重插入 ...
- android 启动页_App启动优化一顿操作猛如虎
前言 本次主要内容包括: 针对App启动优化我们做了哪些工作? 1.App启动优化方向:视觉体验优化 2.App启动优化方向:代码逻辑优化 一.App启动优化方向:视觉体验优化 App启动时白屏问题 ...
- Android 启动优化(五)- AnchorTask 1.0.0 版本正式发布了
今天,更新一下 Android 启动优化有向无环图系列的最后一篇文章.最近一段时间,暂时不会更新这方面的文章了.系列文章汇总如下: Android 启动优化(一) - 有向无环图 Android 启动 ...
- 深入探索Android 启动优化(七) - JetPack App Startup 使用及源码浅析
本文首发我的微信公众号:徐公,想成为一名优秀的 Android 开发者,需要一份完备的 知识体系,在这里,让我们一起成长,变得更好~. 前言 前一阵子,写了几篇 Android 启动优化的文章,主要是 ...
- 启动优化·基础论·浅析 Android 启动优化
" [小木箱成长营]启动优化系列文章(排期中): 启动优化 · 工具论 · 启动优化常见的六种工具 启动优化 · 方法论 · 这样做启动优化时长降低 70% 启动优化 · 实战论 · 手把手 ...
- Android 启动优化(一) - 有向无环图
前言 说到 Android 启动优化,大家第一时间可能会想到异步加载.将耗时任务放到子线程加载,等到所有加载任务加载完成之后,再进入首页. 多线程异步加载方案确实是 ok 的.但如果遇到前后依赖的关系 ...
- Android启动优化实战(有效降低APP启动时间)
1.概述 手机点击一个APP,用户希望应用能够及时响应并快速加载.启动时间过长的应用不能满足这个期望,并且可能会令用户失望.这种糟糕的体验可能会导致用户在 Play 商店针对您的应用给出很低的评分,甚 ...
- 【转】Android APP 启动黑屏优化补丁 (2016-01-18 10:35:23)
[转]Android APP 启动黑屏优化补丁 (2016-01-18 10:35:23) 转载▼ 这个必须转,这才是高手,解决官方都解决不好的问题! 原文地址,以下为转贴内容: 使用说明 ***** ...
- Android启动优化方案调研
/ 今日科技快讯 / 7月21日,国家互联网信息办公室依据<网络安全法><数据安全法><个人信息保护法><行政处罚法>等法律法规,对滴滴全球股份 ...
- Android启动界面优化技巧-Splash Screens的正确方式
备注:这里是开发跨平台App时,适配Android启动屏幕,主要为了防止白屏.玩Android开源App 往往我们在开发Android的时候会出现白屏等等,主要原因就是启动时需要加载的资源过多,从而影 ...
最新文章
- 有关博弈人机混合智能的再思考
- android edittext设置内容为空,android – 我将EditText的InputType设置为TYPE_NULL后无法更改...
- 地图中添加沿线文字标注
- python列表操作符_python——列表操作符
- Mybatis 批量操作总结
- Redis 6.0.0 GA
- 微课|中学生可以这样学Python(例3.2):今天是今年的第几天
- c语言图像压缩算法实现_kakadu——JPEG2000图像压缩软件的安装和使用
- docker容器别人访问很卡_一篇文章带你走进Docker的世界
- 游戏音效是用什么软件做的?
- PHP实现 鸡兔同笼的问题
- errorreporting php,php-phpin的error_reporting 22527中的22527是什么
- 怎么提取pdf中的表格数据_如何从pdf第1部分中提取表格数据
- iFunk超极本或出新,你最想知道什么
- 关于信息安全风险评估,你需要知道的
- 求生之路怎么显示所有服务器,求生之路2怎么屏蔽rpg服务器 求生之路2屏蔽rpg服务器方法_游侠网...
- ESP8266Wi-Fi数据通讯
- 图像主结构的提取方法
- uni-app返回上一层页面后数据刷新重置解决办法,uni-app页面不刷新,强制刷新页面方法!
- Linux链路捆绑的两种方法