• 安卓开发之性能优化


    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文件中配置

    1. <style name="MyStyle" parent="AppTheme">
    2. <item name="android:windowNoTitle">true</item>
    3. <item name="android:windowBackground">@null</item>
    4. </style>

    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也销毁

    1. @Override
    2. protected void onDestroy() {
    3. if (webView!= null) {
    4. webView.destroy();
    5. webView= null;
    6. }
    7. super.onDestroy();
    8. }

    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规避守则,譬如多次操作数据库操作等。

  • 相关阅读:
    大一学生作品《前端框架开发技术》 期末网页制作 HTML+CSS+JavaScript 个人主页网页设计实例
    QT项目工程模块化管理代码之添加Pri文件及实现文件
    【C语言】三子棋(经典解法+一览图)
    【Java第22期】:Thread 类的基本用法
    一文深入搞懂ARM处理器架构
    北京大学计算机考研经验分享汇总
    CHATGPT它它它它它崩了~
    lark发消息艾特接口
    WPF优秀组件推荐之FreeSpire
    前端JS学习(一)
  • 原文地址:https://blog.csdn.net/xxpr_ybgg/article/details/127099946