对与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 启动优化的更多相关文章

  1. android启动优化

    ############################################## # power on till android lock screen comes up # # get ...

  2. Android性能优化之App应用启动分析与优化

    前言: 昨晚新版本终于发布了,但是还是记得有测试反馈app启动好长时间也没进入app主页,所以今天准备加个班总结一下App启动那些事! app的启动方式: 1.)冷启动      当启动应用时,后台没 ...

  3. Android内核开发:系统启动速度优化-Android OS启动优化(转)

    Android系统的启动优化主要分为三大部分: (1) Bootloader优化 (2) Linux Kernel的剪裁与优化 (3) Android OS部分的剪裁与优化 本文重点关注Android ...

  4. Android性能优化(一)之启动加速35%

    一.前言 随着项目版本的迭代,App的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关,从本篇文章开始,我将开启一个Android应用性能优化的专题,从理论到实战,从入门到深挖,手把手将性能优 ...

  5. Android性能优化系列之App启动优化

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 Android性能优化系列之apk瘦身 应用的启动速度缓慢是我们在开发过程中常常会遇到的问题,比方启动缓慢导致的黑屏.白屏问 ...

  6. Android 项目优化(五):应用启动优化

    介绍了前面的优化的方案后,这里我们在针对应用的启动优化做一下讲解和说明. 一.App启动概述 一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意 ...

  7. Android 性能优化 ---- 启动优化

    Android 性能优化 ---- 启动优化 1.为什么要进行启动优化 一款应用的第一印象很重要,第一印象往往决定了用户的去留.打开一款应用,如果速度很快,很顺畅,那么很容易让人觉得这款应用背后的技术 ...

  8. 【腾讯Bugly干货分享】Android性能优化典范——第6季

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...

  9. android 性能优化

    本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...

随机推荐

  1. JDK安装遇见的问题及解决方案

    问题描述: Jdk安装完成后从新启动电脑,打开eclipse报找 不到JRE或JDK,在cmd中输入  java -version 也不显示JDK信息. 后把JDK配置的环境变量path的JAVA_H ...

  2. 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制

    转自http://blog.csdn.net/jamesjxin/article/details/46606307 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFo ...

  3. Lsyncd - 实时文件同步工具(精译)

    原文: http://axkibe.github.io/lsyncd/ 描述 Lsyncd监视本地目录树事件监视器接口(inotify或fsevents).它聚集并组合事件几秒钟,然后生成一个(或多个 ...

  4. Java 8 Documentation Download

    Java API 下载方法 https://www.oracle.com/index.html https://www.oracle.com/java/technologies/java-se.htm ...

  5. JavaScript设计模式 Item 7 --策略模式Strategy

    1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...

  6. spring(一)--spring/springmvc/spring+hibernate(mybatis)配置文件

    这篇文章用来总结一下spring,springmvc,spring+mybatis,spring+hibernate的配置文件 1.web.xml 要使用spring,必须在web.xml中定义分发器 ...

  7. session会话管理

    session会话和cookie一起被称为会话跟踪技术,主要通过保存在服务器端的session数据和客户端浏览器的cookie数据共同完成用户访问服务器的足迹记录. 1. 什么是会话 会话sessio ...

  8. 怎样在Ubuntu中设置环境变量

    首先启动终端. 单击屏幕左上角的Ubuntu图标,在弹出的窗口中点击搜索栏,输入"terminal", 稍等片刻,终端就会赫然在目!二话不说,直接点击!     然后打开环境设置文 ...

  9. 深入理解SpringCloud之分布式配置

    Spring Cloud Config Server能够统一管理配置,我们绝大多数情况都是基于git或者svn作为其配置仓库,其实SpringCloud还可以把数据库作为配置仓库,今天我们就来了解一下 ...

  10. Java 读书笔记 (二) 对象和类

    Java 作为一种面向对象语言,支持以下基本概念: 多态 继承 封闭 抽象 类 对象 实例 方法 重载 对象: 是类的一个实例,有状态和行为.以人为例,黄种人.白种人.黑种人为类,每一个具体的人为类的 ...