Android 启动优化
对与Android的项目来说,app的启动速度是非常重要的。因为用户打开你的app给别人的第一体验就是打开软件的速度。但是app的启动速度是比较难以缩短的,因为一般来说开发者在app的启动入口都会创建一些比较耗时的操作,比方说使用SharedPreferences,初始化一些第三方的类库还有进行网络请求的判断。关于启动的优化可以分为两个方向来进行。第一:使用多线程充分利用好cup的运行效率提高运行时的速度;第二:使用延迟加载的方式将不重要的一些耗时的操作放到界面显示之后在做。
第一点使用异步方法加快启动时的速度。首先还是重写Application方法在onCreate方法里面初始化,然后建立一个手机核数对于的线程池,在线程池里面异步的加载耗时的操作。这样就可以进行异步的加载方式
//手机的核数
final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
final int CORE_POOL_SIZE = Math.max(2,Math.min(CPU_COUNT-1,4));
//优化启动方式
//异步方式创建线程池
ExecutorService service = Executors.newFixedThreadPool(CORE_POOL_SIZE); //将初始化操作放到线程池里面去
service.submit(new Runnable() {
@Override
public void run() {
initA();
}
}); service.submit(new Runnable() {
@Override
public void run() {
initB();
}
}); service.submit(new Runnable() {
@Override
public void run() {
initC();
}
});
但是这样的加载方式还是存在者问题,由于这些都是异步加载的内容所有不知道这些初始化到底什么时候完成,所以可能还是需要进行一些处理。比方说我们的App一开始就需要这个初始化的数据但是在主线程调用的时候并没有初始化完,在这个时候就可能产生异常,有的必须在Application里面初始化成功才有作用。所以可以使用CountDownLatch。
首先初始化一个CountDownLatch后,在异步进程的最后调用await方法等待里面的进程countDown,这样就可以保证我们想要的进程一定可以执行完
private CountDownLatch mCountDownLatch = new CountDownLatch(1);
mCountDownLatch.countDown();
mCountDownLatch.await();
private CountDownLatch mCountDownLatch = new CountDownLatch(1);
//手机的核数
final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
final int CORE_POOL_SIZE = Math.max(2,Math.min(CPU_COUNT-1,4));
onCreate里面的方法
//异步方式创建线程池
ExecutorService service = Executors.newFixedThreadPool(CORE_POOL_SIZE);
//将初始化操作放到线程池里面去
service.submit(new Runnable() {
@Override
public void run() {
//初始化的方法
initA();
mCountDownLatch.countDown();
}
});
service.submit(new Runnable() {
@Override
public void run() {
initB();
}
});
service.submit(new Runnable() {
@Override
public void run() {
initC();
}
});
try {
//等待完成之后就会完成的
mCountDownLatch.await();
}catch (Exception e){
e.printStackTrace();
}
如上面的代码所示除非initA方法执行完毕之后才会继续向下执行。
第二点使用延迟加载的方式将不重要的一些耗时的操作放到界面显示之后在做
我们可以先观察把一些一开始非必要的内容在MainActivity显示后进行初始化,在界面成功显示之后使用Handler进行延迟的初始化。
new Handler().postDelayed(new Runnable(){
public void run() {
//进行初始化
}
}, 2000);
Android 启动优化的更多相关文章
- android启动优化
############################################## # power on till android lock screen comes up # # get ...
- Android性能优化之App应用启动分析与优化
前言: 昨晚新版本终于发布了,但是还是记得有测试反馈app启动好长时间也没进入app主页,所以今天准备加个班总结一下App启动那些事! app的启动方式: 1.)冷启动 当启动应用时,后台没 ...
- Android内核开发:系统启动速度优化-Android OS启动优化(转)
Android系统的启动优化主要分为三大部分: (1) Bootloader优化 (2) Linux Kernel的剪裁与优化 (3) Android OS部分的剪裁与优化 本文重点关注Android ...
- Android性能优化(一)之启动加速35%
一.前言 随着项目版本的迭代,App的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关,从本篇文章开始,我将开启一个Android应用性能优化的专题,从理论到实战,从入门到深挖,手把手将性能优 ...
- Android性能优化系列之App启动优化
Android性能优化系列之布局优化 Android性能优化系列之内存优化 Android性能优化系列之apk瘦身 应用的启动速度缓慢是我们在开发过程中常常会遇到的问题,比方启动缓慢导致的黑屏.白屏问 ...
- Android 项目优化(五):应用启动优化
介绍了前面的优化的方案后,这里我们在针对应用的启动优化做一下讲解和说明. 一.App启动概述 一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意 ...
- Android 性能优化 ---- 启动优化
Android 性能优化 ---- 启动优化 1.为什么要进行启动优化 一款应用的第一印象很重要,第一印象往往决定了用户的去留.打开一款应用,如果速度很快,很顺畅,那么很容易让人觉得这款应用背后的技术 ...
- 【腾讯Bugly干货分享】Android性能优化典范——第6季
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...
- android 性能优化
本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...
随机推荐
- laravel5.5 延时队列的使用
队列这个知识相对比较冷门,因为平时的CURD基本用不到这个知识,今天用到了,所以就写个博客记录一下吧. 首先你得清楚要用什么驱动,除了database队列驱动(选择database驱动要php art ...
- textarea 里设置 style="resize:none"
禁止textarea拉伸的方法是:: 设置这个 style="resize:none" 属性 例子: < ...
- wireshark使用方法
抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口.点击Capture Opti ...
- 【转】spring cloud eureka 参数配置
eureka.client.registry-fetch-interval-seconds 表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅 ...
- Fedora Linux中解决“xxx不在sudoers文件中”
问题描述: 在Fedora中执行一些操作时需要使用root权限,当我使用命令: sudo 想在普通用户中临时获得root权限时,却被提示: "xxx 不在 sudoers 文件中.此事将被报 ...
- 关于多条数据转为json格式单次传输的问题 2017.05.27
数据形式如下: var mycars = [];//定义数组存放多条数据 for(var i=0;i<2;i++){ var jsonData = {};//定义变量存放单条数据 jsonDat ...
- ajax跨域问题(php)
ajax出现请求跨域错误问题,主要原因就是因为浏览器的"同源策略". 解决方法(我只用过下面这3种): 1. 架设服务器代理:即浏览器请求同源服务器,再由后者请求外部服务(之前博主 ...
- reader-write.go
{ return n, err } r.bucket.Wait(int64(n)) return n, err } type writer struct { ...
- Django rest_framework快速入门
一.什么是REST 面向资源是REST最明显的特征,资源是一种看待服务器的方式,将服务器看作是由很多离散的资源组成.每个资源是服务器上一个可命名的抽象概念.因为资源是一个抽象的概念,所以它不仅仅能代表 ...
- bzoj4067 [Ctsc2015]gender
好神的一道题啊! 我们发现题目中的ln的贡献非常傻逼,但是我们可以发现这个东西的取值只有40个左右,于是我们可以枚举他! 枚举完了对于题里的贡献就是一个普通的最小割,采用的是文理分科的思想,与S连代表 ...