zoukankan      html  css  js  c++  java
  • Android优化

    1 代码优化

    1.1 缓存结果

       使用Android的稀疏数组(Spare Array):SparseArray、SpareBooleanArray、

     SparseIntArray对结果进行缓存.当然也可以使用也可是使用Java容器缓存. 不过Android定义的SpareArray类,当键是整数时,比容器的HashMap效率

    高.因为HashMap使用的是java.lang.Integer对象,而SparseArray使用的基本类型int.因此使用HashMap会创建很多Integer对象,而使用SpareArray则可避免.当然HashMap也是有好处的,就是可以不依赖android.总之:使用缓存存储结果.随便提下:LruCache<K,V > 是使用缓存不错的选择、它可以定义缓存的最大长度,注意的是它是Android3.1引入的.

    1.2 响应能力

       其实大家都知道Android有一个主线程也称为UI线程,可以说应用就在其中

    运行.在主线程中运行所有代码是可以的,但不推荐.因为应用只有一个主线程,因此所有时间都按顺序处理.这样响应能力会受到影响,说不定给予没有响应对话框即大家说的假死.那么我们有哪些方法呢:

    1.2.1 降低布局复杂度

    Android的onCreate() 方法一般会包含调用setContentView展开资源方法.然展开资源是一个很大开销操作,那么我们使用RelativeLayout代替嵌套LinerLayouts;<merge/>标签来合并布局,往往自己布局的顶层元素是一个Fragmentlayout;多次使用相同的组成部分用<include/>包含; 同时用使用SDK的layoutopt工具来分析布局来降低布局复杂度.

    1.2.2 推迟初始化

    内存分配需要花时间,等到对象真正需要时才进行配置.使用ViewStub来

    推迟初始化.感觉有点像Java中延迟加载似的.

    1.2.3 转移线程

    “假死”是因为输入事件在5秒钟没有被处理或者BroadcastReceiver在10秒内没有执行完毕,那么这个”假死”对话框弹出来. 我们可以把操作转移到另一个线程来加快应用响应速度.单一定要确保是任务执行慢原因、而不是坏的算法或实现.

    1.2.4 检测缓慢代码

    使用StrictMode检测应用中执行缓慢的代码或潜在缓慢的代码.

    从主线程调用start() 执行时间太长,如果StrictMode Thread策略配置为

    检测缓慢调用时会出现如下日志:

    1.3 数据库

    1.3.1 优化SQL语句字符串

            因为String是不可改变的,会分配2倍的对象( 查看Java String),所以使用StringBuilder或调用String.format()加快SQL语句字符串的创速度.

    1.3.2 预编译 

           预编译我相信做开发都知道数据库操作预编译吧,也知道其作用!那么Android中也有预编译.是SQLiteDatabasecompileStatement();  

    1.3.3 事务

          Android跟JDBC一样,没有设置事务时会自动为每个操作创建一个事务 并且在每次操作后立即提交.但有时候我们多数据插入所有到完成或不完成.那么还是用原方法效率是极低的而且是错误的.这就需要我们自己建立事务.

    1.3.4 只读需要的数据

    调用查询时选择正确的参数可以使性能得到客观的提高.如果只需要一定数量的行,指定查询调用的限制参数(),则可以进一步减少数据库访问时间.比如:SQLite的选择合适的查询方法(query()有几种根据情况选择) 、SQL中加Limit和Offset进行分页.

    2 内存优化

    2.1 避免类型转换.尽量保持类型一致.

    2.2 满足要求的最小数据类型 

           当使用到数组的值很多很大时可以将数据存在几个数组中.比如:需要存储0-10W大数据,一个数组存0-32767(short数组),一个存大于32767(int数组),虽然有点复杂,但内存节约和潜在的性能会提升很大甚至优化方法实现.

    3 多线程与同步

    3.1 使用Thread

    3.2 使用AsyncTask

         AsyncTask在UI线程中收到非UI线程中处理事件的结果刷新UI.

    3.3 Handler和Looper 

         Lopper用来封装消息循环和消息队列的一个类,一般和Handler同时运用.Handler在非UI线程创建会报错,需使用Looper才可以.

    3.4 Activity生命周期

    Activity和线程共用时需注意两点:

    ① 转屏幕就创建新的对象,那么旧对象设置的状态将无效.

    ② 内部类与外围类实例相关联,不会关联到新实例,因此新实例不会有响应.

    4 性能评测和剖析

    4.1 时间测量

     使用Debug.threadCpuTimeNanos()进行时间测量.它只测量在当前线程中所花费的时间,所以它的结果更正确.不过,如果要测量的部分运行在多个线

      程上,只调用一次Debug.threadCpuTimeNanos()不会给出准确的估值,必须在所有涉及的线程调用此方法并把结果相加.

    4.2 方法调用跟踪

         方法调用跟踪直接使用Eclipse DDMS视图中生成跟踪文件.选定一个进程后,可以点击Start Method Profiling 方法开始剖析 (这个图标),然后再次

    点击就停止剖析.一旦停止,跟踪就会在Eclipse Debug视图中呈现.

  • 相关阅读:
    [IOS] iphone开发之UITableView之UITableViewCell [待续中。。。]
    人生需有三心境,你有吗?
    iPad iPhone程序增加启动画面
    [转载]IOS学习之UIApplication深入学习
    [IOS] iphone开发之[美化按钮]
    程序中调用Safari
    ios编程:iPhone Howto:给UIView拍照
    IOSAPNS 消息推送实践
    ios 设备方向判断
    [IOS]iphone开发之横屏与竖屏在不同视图之间的切换
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/3559833.html
Copyright © 2011-2022 走看看