Android 性能优化

关于性能优化的文章,网上很多,觉得自己还是总结一下。一个高性能的应用程序优化必定要到位。

Android 中我一般分为两部分,布局和业务代码部分,首先看一下布局方面的一些常用优化方式

一、重用布局文件

说到重用,那说一下标签。

标签可以允许在一个布局当中引入另外一个布局,那么比如说我们程序的所有界面都有一个公共的部分,这个时候最好的做法就是将这个公共的部分提取到一个独立的布局文件当中,然后在每个界面的布局文件当中来引用这个公共的布局。

比如一个程序里面都会有一个标题栏也就是头布局,我们可以把这个头布局单独拿出来放到一个独立的布局文件中,在其他页面调用即可。如下代码



    

    

需要注意的是,如果我们想要在标签当中覆写layout属性,必须要将layout_width和layout_height这两个属性也进行覆写,否则覆写效果将不会生效。

标签是作为标签的一种辅助扩展来使用的,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。上面说到的head_layout.xml是这样的:



    

    


仔细看,主布局的跟布局和头布局的跟布局都是一样的,这时候我们可以考虑使用merge替换 LineaLayout,这样的话可以减少层级之间的嵌套,当然,肯定有人就有疑问了, 标签有什么限制没?当然有,像上面这种只是举例说明,如果我的头布局是水平方向的,主页面嵌套的是垂直方向的,这时候就有问题了,这时候就不能使用了,还得使用LineaLayout。

ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。用显示隐藏的方法举例:



    
content.xml里面只有一个TextView,看activity的代码:

   final ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);
        if (viewStub != null) {
            View inflatedView = viewStub.inflate();
            textView = (TextView) inflatedView.findViewById(R.id.tv_content);
        }
        findViewById(R.id.btn_visible).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewStub.setVisibility(View.VISIBLE);
            }
        });

        findViewById(R.id.btn_gone).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewStub.setVisibility(View.GONE);
            }
        });

调用inflate()方法之后会将加载出来的布局进行返回,之后我们就可以对这个布局进行任意的操作了,再次隐藏显示,或者获取子元素的实例等。不过需要注意一点,ViewStub所加载的布局是不可以使用标签的,具体需求视自己情况而定了。

具体可参考官网:http://developer.android.com/reference/android/view/ViewStub.html


二、当界面不可见时释放内存

当退出当前activity是释放资源,一般会在onStop里面释放资源。

三、避免在Bitmap上浪费内存

一张图片解析成一个Bitmap对象时所占用的内存并不是这个图片在硬盘中的大小,可能一张图片只有100k你觉得它并不大,但是读取到内存当中是按照像素点来算的,比如这张图片是1500*1000像素,使用的ARGB_8888颜色类型,那么每个像素点就会占用4个字节,总内存就是1500*1000*4字节,也就是5.7M了,所以说尽量不要去加载不需要的分辨率图片。

四、使用优化过的数据集合
Android API当中提供了一些优化过后的数据集合工具类,如SparseArray,SparseBooleanArray,以及LongSparseArray等,使用这些API可以让我们的程序更加高效。传统Java API中提供的HashMap工具类会相对比较低效,因为它需要为每一个键值对都提供一个对象入口,而SparseArray就避免掉了基本数据类型转换成对象数据类型的时间。

五、知晓内存的开支情况
我们还应当清楚我们所使用语言的内存开支和消耗情况,并且在整个软件的设计和开发当中都应该将这些信息考虑在内。可能有一些看起来无关痛痒的写法,结果却会导致很大一部分的内存开支,例如:
使用枚举通常会比使用静态常量要消耗两倍以上的内存,在Android开发当中我们应当尽可能地不使用枚举。
任何一个Java类,包括内部类、匿名类,都要占用大概500字节的内存空间。
任何一个类的实例要消耗12-16字节的内存开支,因此频繁创建实例也是会一定程序上影响内存的。
在使用HashMap时,即使你只设置了一个基本数据类型的键,比如说int,但是也会按照对象的大小来分配内存,大概是32字节,而不是4字节。因此最好的办法就是像上面所说的一样,使用优化过的数据集合。

六、谨慎使用抽象编程
许多程序员都喜欢各种使用抽象来编程,认为这是一种很好的编程习惯。当然,这一点不可否认,因为的抽象的编程方法更加面向对象,而且在代码的维护和可扩展性方面都会有所提高。但是,在Android上使用抽象会带来额外的内存开支,因为抽象的编程方法需要编写额外的代码,虽然这些代码根本执行不到,但是却也要映射到内存当中,不仅占用了更多的内存,在执行效率方面也会有所降低。当然这里我并不是提倡大家完全不使用抽象编程,而是谨慎使用抽象编程,不要认为这是一种很酷的编程方式而去肆意使用它,只在你认为有必要的情况下才去使用。

七、使用ProGuard简化代码
ProGuard相信大家都不会陌生,很多人都会使用这个工具来混淆代码,但是除了混淆之外,它还具有压缩和优化代码的功能。ProGuard会对我们的代码进行检索,删除一些无用的代码,并且会对类、字段、方法等进行重命名,重命名之后的类、字段和方法名都会比原来简短很多,这样的话也就对内存的占用变得更少了。

来自:http://blog.csdn.net/guolin_blog/article/details/42238627

八、避免创建不必要的对象

  • 如果我们有一个需要拼接的字符串,那么可以优先考虑使用StringBuffer或者StringBuilder来进行拼接,而不是加号连接符,因为使用加号连接符会创建多余的对象,拼接的字符串越长,加号连接符的性能越低。
  • 在没有特殊原因的情况下,尽量使用基本数据类来代替封装数据类型,int比Integer要更加高效,其它数据类型也是一样。

九、静态优于抽象

如果只是想调用某个类的某个方法来去完成一项通用的功能,那么可以将这个方法设置成静态方法,这会让调用的速度会大幅度提升,同时也不用为了调用这个方法而去专门创建对象。另外这也是一种好的编程习惯,因为我们可以放心地调用静态方法,而不用担心调用这个方法后是否会改变对象的状态。

十、对常量使用static final修饰符


你可能感兴趣的:(android)