关于android应用开发中性能优化的一些建议

 1 调用频繁的方法尽快返回, 减少耗时操作

这种方法有一个特点,那就是由程序员覆盖系统中的方法来实现, 并且不是由程序员显示的调用而是由系统框架调用

在android开发中有一个具体的例子: Adapter的getView()方法

该方法被框架调用,以获得listview中的一个条目. 这个方法在listview初始化或上下滑动listview时会被多次调用

所以该方法要尽快返回一个view对象, 避免一些耗时的操作, 必要时缓存view对象

2 避免创建过多的对象

java是一种自动内存管理的语言,不需要程序员做清理内存的工作.创建的所有对象由GC(垃圾回收)负责清理.

但是GC需要一个后台线程的支持.如果创建的对象过多,会影响效率. 一是创建对象本身就具有动态分配内存的开销,

二是GC线程就会一直执行来清理不再使用的对象,占用较多的CPU资源,这样前台

工作线程占用的CPU资源就会减少, 从而降低效率.

在android开发中的一个典型例子是监听器. 假设有100个按钮, 每个按钮都要设置一个监听器, 有以下两种写法:

写法一:

button1.setOnClickListener(new OnClickListener(){...});

button2.setOnClickListener(new OnClickListener(){...});

button3.setOnClickListener(new OnClickListener(){...});

...

button100.setOnClickListener(new OnClickListener(){...});

写法二:

class ButtonOnclickListener impliments View.OnClickListner{

    public void onClick(View view){

        ...

    }

}

ButtonOnclickListener buttonListener = new ButtonOnclickListener();

button1.setOnClickListener(buttonListener);

button2.setOnClickListener(buttonListener);

button3.setOnClickListener(buttonListener);

...

button100.setOnClickListener(buttonListener);

很明显, 第二种写法更好,因为第二种方法只创建了1个监听器对象而第一种写法创建了100个不同的对象

以下是根据android官方文档上的一篇文章整理的,文章地址http://developer.android.com/training/best-performance.html

1 尽量使用静态方法

对象的主要作用是封装数据,类中的成员方法用于访问这些数据(属性), 如果没有数据需要封装时, 最好使用静态方法替换成员方法.

成员方法是以虚方法(Virtual)的方式调用,会有更多的性能开销

静态方法都是非虚方法,调用机制比较简单直接,比成员方法的调用提升15% ~ 20%的性能

此外,静态方法不会依赖于对象的状态, 也不会改变对象的状态

2 把常量定义成static final的

如果定义成以下方式

class Demo {

        static int intVal = 42;

        static String strVal = "Hello world";

        ...

}

有两个方面开销比较大:

1 编译器会为这两个静态变量的初始化生成一个名称为<clinit>的方法, 即有初始化的开销

2 以后对这两个变量的访问也会有一定的开销, 即访问开销

如果定义成以下方式

class Demo {

        static final int intVal = 42;

        static final String strVal = "Hello world";

         ...

}

编译器发现是常量, 那么就不会创建两个变量存储42和"Hello world"这两个值, 既然没有变量, 也就不涉及变量的初始化

也就没有初始化的开销

当这两个常量以后被访问时, 编译器发现是对常量的访问,直接将常量替换成对42和"Hello world"这两个值, 也就不会有变量的访问开销

3 避免使用get和set方法

在对象中, 使用get和set方法访问属性会带来很好的封装性, 避免对象中的数据被破坏.

在C++等原生语言中get和set方法不会带来很大的性能开销, 因为C++等语言会将get和set方法内联(inline),这样就没有方法调用的开销

但在java语言中,get和set方法是成员方法, 是虚方法, 虚方法的调用开销比较大

在android等嵌入式设备上, cpu运算速度较低, 可以取消get和set方法, 直接访问成员变量

在android上, 直接访问成员变量的速度比使用get方法访问块4~7倍

4 使用增强for循环遍历集合或数组

增强for循环(for-each)可以用来遍历实现Iterable接口的集合, 也可以遍历数组

在某些情况下, 比普通for循环快3倍

5 将内部类的访问权限设置成包访问权限而不是private

public class Foo {

    private class Inner {

         void stuff() {

                Foo.this.doStuff(Foo.this.mValue);

         }

    }

}

public class Foo {

    /*package*/class Inner {

        void stuff() {

            Foo.this.doStuff(Foo.this.mValue);

        }

    }

}

6 尽量避免使用浮点数

在android设备上, 浮点运算比整型运算慢2倍

相关推荐