欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

安卓开发之性能优化

程序员文章站 2022-05-09 20:53:02
1. 避免创建不必要的对象 创建太多的对象会造成性能低下,首先分配内存本身需要时间,其次虚拟机运行时堆内存使用量是有上限的, google原生OS的默认值是16M,但是各个...
1. 避免创建不必要的对象
创建太多的对象会造成性能低下,首先分配内存本身需要时间,其次虚拟机运行时堆内存使用量是有上限的,

google原生OS的默认值是16M,但是各个厂家的OS会对这个值进行修改。比如本人小米2S为例,这个值应该是96M。

当使用量到达一定程度时会触发垃圾回收,垃圾回收会使得线程甚至是整个进程暂停运行。可想而知,如果有对象频繁的创建和销毁,或者内存使用率很高,就会造成应用程序严重卡顿。

2.合理使用static成员
主要有三点需要掌握:

不要将视图控件声明为static,因为View对象会引用Activity对象,当Activity退出时其对象本身无法被销毁,会造成内存溢出。

静态引用的对象不会被垃圾回收

只要静态变量没有被销毁也没有置null,其对象一直被保持引用,也即引用计数不可能是0,因此不会被垃圾回收。因此,单例对象在运行时不会被回收。

3. 避免内部的Getters/Setters

面向对象设计中,字段访问使用Getters/Setters通常是一个好的原则,但是在Android开发中限于硬件条件,除非字段需要被公开访问,否则如果只是有限范围内的内部访问(例如包内访问)则不建议使用Getters/Setters。在开启JIT时,直接访问的速度比间接访问要快7倍。

4. 使用增强for循环

优先使用增强for循环通常情况下会获得更高的效率;除了一种情况,即对ArrayList进行遍历时,使用普通的for循环效率要更高。

5.布局优化:

采用优化布局层数。 采用

6.移除Activity默认背景,提升activity加载速度。

如果确信在Activity中使用不透明的背景,那么可以移除Activity的默认背景。
在代码中:getWindow().setBackgroundDrawable(null);
也可以在styles样式文件中设置并在Manifest文件中配置


true
        @null

7.广播BroadCast动态注册时,记得要在调用者生命周期结束时unregisterReceiver,防止内存泄漏。

8.合理使用StringBuffer,StringBuilder,String
在简单的字符串拼接中,String的效率是最高的,例如String s = “hello” + “world”;
但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,例如:
    String str2 = “This is”;
    String str3 = “ a ”;
    String str4 = “ test”;
    String str1 = str2 +str3 + str4;
这里就要求使用StringBuilder了

在单线程中,StringBuilder的性能要比StringBuffer高。多线程为了线程安全需要采用StringBuffer,因为它是同步的。常规下一般用StringBuilder。

9.尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。

简单说一下栈和堆的区别:

栈是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

10.I/O流操作记得及时关闭流对象。

11.使用Application Context代替Activity中的Context
不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的
对于生命周期长的对象,可以使用Application Context

不要把Context对象设置为静态。

12.集合中的对象要及时清理
 我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
13.Bitmap的使用
较大的Bitmap注意压缩后再使用,加载高清大图可以考虑BitmapRegionDecoder的使用,

不再使用的Bitmap注意及时recycle().

14.尽量不要使用整张的大图作为资源文件,尽量使用9path图片

应用图标优先放在mipmap目录下(AndroidStudio环境),其他资源图,.9图应该放在drawable-xxxx下,需要复制到手机sd卡上使用的应放在asset目录

15.关于WebView

在Activity或者Fragment销毁时记得把WebView也销毁

@Override
    protected void onDestroy() {
        if (webView!= null) {
            webView.destroy();
            webView= null;
        }
        super.onDestroy();
    }
16.UI性能优化总结

布局优化;尽量使用include、merge、ViewStub标签,尽量不存在冗余嵌套及过于复杂布局,尽量使用GONE替换INVISIBLE,使用weight后尽量将width和heigh设置为0dp减少运算,Item存在非常复杂的嵌套时考虑使用自定义View来取代,减少measure与layout次数等。

列表及Adapter优化;尽量复用getView方法中的相关View,不重复获取实例导致卡顿,列表尽量在滑动过程中不进行UI元素刷新等。

背景和图片等内存分配优化;尽量减少不必要的背景设置,图片尽量压缩处理显示,尽量避免频繁内存抖动等问题出现。

自定义View等绘图与布局优化;尽量避免在draw、measure、layout中做过于耗时及耗内存操作,尤其是draw方法中,尽量减少draw、measure、layout等执行次数。

避免ANR,不要在UI线程中做耗时操作,遵守ANR规避守则,譬如多次操作数据库操作等。