Android性能优化

一、布局优化:

1、优化方式:

  • 减少不必要嵌套,尽可能使用LinearLayout、ConstraintLayout等控件
  • 减少颜色覆盖,子控件背景足够,不要在其父控件加颜色
  • 使用include、merge、ViewStub
    • include:布局复用
    • merge:去除多余层级
    • ViewStub:按需加载,当调用setVisibility或者inflate方法时才将布局加载到内存中

2、检查方式:

一般打开开发者选项中,调戏GPU过渡绘制的按钮,通过查看布局颜色深度来检查过渡绘制的情况

二、绘制优化:

每帧绘制时间不超过16ms
1、优化方式:

  • 减少在onDraw方法做耗时操作(循环等)
  • 大量创建局部对象,因为onDraw会频繁调用,导致产生大量临时对象,引起过多占用内存和频繁GC

三、内存优化:

  • 避免内存泄漏的出现
  • 线程优化:使用线程池
  • 压缩Bitmap
  • 不要通过Intent传递大数据(1MB)
  • 页面退出时注意清理动画、回收图片资源等 1、内存泄漏
    无用对象的内存得不到及时释放。因为长生命周期的对象持有短生命周期的引用,导致短生命周期的对象无法被回收。

2、常见内存泄漏:

  • 集合对象泄漏
  • 静态变量、单例持有对象
  • 非静态内部类、匿名内部类持有外部类引用
  • 资源未关闭

3、举例说明:

(1) 静态集合:

public static List<Object> sObjects = new ArrayList<>();public void newList(){for (int i = 0; i < 100; i++) {sObjects.add(new Object());}
}
复制代码

静态集合只有多个对象,导致没法被回收
解决方式:使用完毕后将集合清理

 sObjects.clear();sObjects = null;
复制代码

(2)单例:

public class SingleInstance {private static SingleInstance sInstance;private Context mContext;private SingleInstance(Context context){this.mContext = context;}public static synchronized SingleInstance getInstance(Context context) {if (sInstance == null) {return new SingleInstance(context);}return sInstance;}
}
复制代码

单例生命周期为全局的,如果传入的Context为Activity,导致Activity无法回收。
解决方式:使用ApplicationContext

public static synchronized SingleInstance getInstance(Context context) {if (sInstance == null) {return new SingleInstance(context.getApplicationContext());}return sInstance;}
复制代码

(3)、静态、匿名内部类:

public class HandleActivity extends Activity{@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);}class MyHandler extends Handler{@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);}}
}
复制代码

常用的创建一个Handler子类,为非静态内部类,会持有外部类(Activity)的引用,导致Activity无法被回收。
解决方式:将MyHandler改为静态内部类,自动不会持有外部类的应用。
可能的问题:如果需要在Handler持有Activity(例如更新UI)
处理方式:使用弱引用(GC的时候无论是否被持有都会被回收),根据实际应用场景使用。

static class MyHandler extends Handler{//使用弱引用,GC的使用Activity可被回收WeakReference<HandleActivity> activity;MyHandler(HandleActivity activity) {this.activity = new WeakReference<>(activity);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);}
}
复制代码

(4)资源未关闭:

  • 网络、文件流、数据库Cursor等
  • 广播取消注册,EventBus取消注册等

4、泄漏检查方式:
可集成LeakCanary检测、使用Memory Monitor或者使用Android studio中的Android Profiler检测。

四、响应速度优化:

1、应用启动初始化:

  • 减少在Application所做的初始化操作,根据业务逻辑可以将统计事件、广告等SDK的初始化的操作移动启屏的Activity中。
  • 部分SDK可通过异步线程进行初始化
  • 如果存在多进程的情况,Application会多次实例化,只在主进行中进行初始化操作

2、避免ANR的出现

  • 不要在Service中做耗时操作,可使用IntentService(线程、自动销毁)
  • 不要在BroadcastReceiver的onReceiver中执行耗时操作,可创建IntentService完成

Android性能优化相关推荐

  1. Android 性能优化

    为什么80%的码农都做不了架构师?>>>    原文作者:鸿洋 原文地址:点我跳转原文 一般情况下,我们谈性能优化基本上会从以下几个方面: App启动速度优化 UI流畅度优化 内存优 ...

  2. Android性能优化系列 + Android官方培训课程中文版

    Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 http: ...

  3. Android性能优化——腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析(附PDF)

    前言 当我们还在用按键.滑盖.翻盖手机的时候,全触屏手机来了; 当我们觉得二维码这项发明没有意义的时候,支付宝和微信等狠狠地给了我们响亮的耳光; 当我们以为扫码支付只有支付宝的时候,微信支付来了; 当 ...

  4. Android性能优化典范第二季

    原文链接:http://hukai.me/android-performance-patterns-season-2/ 1)Battery Drain and Networking 对于手机程序,网络 ...

  5. Android性能优化之渲染篇(一)

    前言 工作有半年多了,自己的技术没有很大的长进,平时也没有注意学习,只是完成了工作任务就可以了,这样下去的话,自己将很难有提高.面对现在激烈的竞争环境以及技术不断的更新,自己真的要去学习,不断的提高自 ...

  6. Android性能优化典范笔记(1)-GPU绘制性能优化

    Android性能优化典范笔记(1)-GPU绘制性能优化 你还可以再Github上找到我的这篇文章:https://github.com/onlynight/ReadmeDemo/tree/maste ...

  7. Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)...

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在 Android开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性.流畅性.稳定性等,是提高用户留存 ...

  8. Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿

    原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...

  9. 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )

    文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...

最新文章

  1. 【算法】BFS刷题总结
  2. android 计算运动速度,android – 计算参考真北的加速度
  3. easyui datagrid 绑定json对象属性的属性
  4. 关于C#内存释放的BUG?
  5. 修正CS2.0中的日历头显示错误
  6. ruoyi 多模块部署_大数据时代,独立部署的商城系统具有哪些优势?
  7. 设计师应该知道的配色工具,有效提高效率和审美
  8. 使用JavaScript和jQuery添加工具提示
  9. 1. SOAP 简介
  10. composer.install
  11. 自然语言理解gpt_GPT-3:自然语言处理的创造潜力
  12. php的UDP攻击,phpddos应对 最近新起一种udp flood的攻击形式
  13. IOS9 SDK下载、设备安装IOS9系统
  14. [uboot 移植]uboot 移植过程
  15. 扩展欧几里得模板+例题
  16. 【STC15】使用PCA0和PCA1做的模拟串口
  17. 波特率、比特率 与数据传输速率的区别
  18. 皮带撕裂检测matlab,基于机器视觉的皮带纵向撕裂检测方法
  19. YYText实现文本与下划线,删除线偏移
  20. windows服务创建

热门文章

  1. leetcode算法题--数组中数字出现的次数
  2. leetcode算法题-- 最长递增子序列的个数★
  3. android 开发数字键盘,Android 仿「微信」自定义数字键盘
  4. java a =a-=aa_Java求s=a+aa+aaa+aaaa+aa...a的值
  5. mysql c where_mysql where条件语句优化笔记
  6. 《Haskell趣学指南》笔记之I/O
  7. 【译】理解 JavaScript 中函数调用和 this
  8. svn提交及更新时的常见问题
  9. 浏览器对于前端的作用
  10. mysql之 mysql 5.6不停机主从搭建(一主一从基于GTID复制)