美文网首页进阶Android的数据处理方案IT圈内那点事儿
Android优化技术(一)之代码优化篇

Android优化技术(一)之代码优化篇

作者: 码道成功 | 来源:发表于2016-11-17 14:17 被阅读966次

    从今天开始我们将进行Android优化技术方面的总结,我们将从不同的视角进行优化技术的分析总结。这一篇是从代码视角进行优化,这些都是平时编码中总结的经验,如有错误或更好的方法建议欢迎各位批评指证。接下来,让我们进入主题吧。

    一、循环的优化

    1、不要在for循环的第二部分语句调用函数

    在开发过程中,我们经常会用for循环来遍历数组操作,在程序中我们有可能会这样写:

    for(int i = 0;i < list.size();i++)
    {
        //执行重复操作
    }
    

    这样的写法会一直执行list.size()方法,从而会消耗更多的性能,最优写法应改为:

    for(int i =0,len = list.size();i < len;i++)
    {
        //执行循环操作
    }
    

    2、不要在循环体内实例化变量

    在实际开发中,我们经常会遇到要把一系列对象添加到List当中,比如我们在给Adapter类提供数据源的场景下,我们通常会这样做:

    for(int i = 0;i < count;i++)
    {
        //创建对象
        MsgBean bean = new MsgBean();
        //添加bean到list
        list.add(bean);
    }
    

    这样的写法,会重复定义大量变量,消耗内存资源,所以我们应该在循环体外面定义引用变量,最优写法应改为:

    MsgBean bean;
    for(int i = 0;i < count;i++)
    {
        //创建对象
        bean = new MsgBean();
        //添加bean到list
        list.add(bean);
    }
    

    二、尽量使用clone()代替new的方式创建对象

    我们在使用new关键字创建对象时,继承树里的整个构造函数链都会被自动调用,并且总是从Object类开始执行直到当前类,因为java里所有类都继承自Object类。但,如果使用clone()方法来实例化一个对象则不会调用构造函数。前提是该类要实现Cloneable接口。在使用工厂设计模式的场景下,应该使用clone()方法代替new关键字,例如:

    public static Message getInstance()
    {
        return new Message();
    }
    

    最优写法应改为:

    private static Message msg = new Message();
    public static Message getInstance()
    {
        return (Message)msg.clone();
    }
    

    三、字符串拼接操作优化

    在java中跟字符串相关的类主要有:StringStringBuilderStringBuffer。关于这三个类的区别在前面的文章《从Java源码角度彻底理解String,StringBuilder和StringBuffer的区别》里已经做过分析,此处不再赘述。如果是静态字符串拼接,则使用“+”,例如:

    String str = "hello" + " world" +  " test";
    

    因为,这种形式的字符串拼接编译器最终会优化成“hello world test”,先检查常量池中是否已经有“hello world test”字符串,如果有则不再创建对象。如果是动态拼接,即拼接的字符串中有变量,则使用StringBuilder和StringBuffer,其中,StringBuffer是线程安全的,所以稍微要比StringBuilder要慢点。例如,

    String result = "";
    StringBuilder sb = new StringBuilder();
    sb.append("hello")
    .append("world")
    .append("Android");
    result = sb.toString();
    

    四、若一个成员方法不需要Override,也不需要访问成员变量,则用static方法

    因为,要实现多态功能,java里要维护一张类似C++里的虚函数表一样的表,所以,当一个方法不需要Override的时候则尽量使用static来修饰,如我们经常使用工具类Utils里的方法则可以全部定义成static方法。例如,

    public static String getName()
    {
        return "hello";
    }
    

    五、数据复制使用System.arrayCopy()方法

    在开发过程中,我们经常会用到数据复制功能,在这里我们推荐System.arrayCopy()这个native方法。因为是native方法,其性能要比普通方法高得多。像上面提到的StringBuilder、StringBuffer里底层也使用了System.arrayCopy(),还有ArrayList和Vector底层也使用该native方法,来实现数据的复制操作。

    public static void arraycopy(Object src,
                                 int srcPos,
                                 Object dest,
                                 int destPos,
                                 int length)
    

    参数说明:
    src:源数组; srcPos:源数组要复制的起始位置;
    dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。

    最后,此处只是简单的列举了日常编码中经常用到的一些优化技巧,并不是全部,还有很多代码优化技巧就不再罗列了,比如I/O操作,网络请求等等。不过,不管何种优化技巧都有一个不变的宗旨可遵循,就是一起围绕时间空间的角度来优化:
    (1)尽最大可能减少语句的执行条数;
    (2)尽最大可能减少变量的创建数目。
    (3)防止内存泄露

    关于前2条,在上述的优化方法技巧中都得到了体现。关于接下来Android优化技术的系列文章,我们将从以下几个视角去分析总结,敬请关注:
    1.内存管理,即内存的分配和回收
    2.程序设计,即常用数据结构与算法,设计模式
    3.运算符使用技巧
    4.UI布局优化

    相关文章

      网友评论

      本文标题:Android优化技术(一)之代码优化篇

      本文链接:https://www.haomeiwen.com/subject/zjddpttx.html