Android性能优化
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性能优化相关推荐
- Android 性能优化
为什么80%的码农都做不了架构师?>>> 原文作者:鸿洋 原文地址:点我跳转原文 一般情况下,我们谈性能优化基本上会从以下几个方面: App启动速度优化 UI流畅度优化 内存优 ...
- Android性能优化系列 + Android官方培训课程中文版
Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 http: ...
- Android性能优化——腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析(附PDF)
前言 当我们还在用按键.滑盖.翻盖手机的时候,全触屏手机来了; 当我们觉得二维码这项发明没有意义的时候,支付宝和微信等狠狠地给了我们响亮的耳光; 当我们以为扫码支付只有支付宝的时候,微信支付来了; 当 ...
- Android性能优化典范第二季
原文链接:http://hukai.me/android-performance-patterns-season-2/ 1)Battery Drain and Networking 对于手机程序,网络 ...
- Android性能优化之渲染篇(一)
前言 工作有半年多了,自己的技术没有很大的长进,平时也没有注意学习,只是完成了工作任务就可以了,这样下去的话,自己将很难有提高.面对现在激烈的竞争环境以及技术不断的更新,自己真的要去学习,不断的提高自 ...
- Android性能优化典范笔记(1)-GPU绘制性能优化
Android性能优化典范笔记(1)-GPU绘制性能优化 你还可以再Github上找到我的这篇文章:https://github.com/onlynight/ReadmeDemo/tree/maste ...
- Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)...
2019独角兽企业重金招聘Python工程师标准>>> 前言 在 Android开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性.流畅性.稳定性等,是提高用户留存 ...
- Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿
原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...
- 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )
文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...
最新文章
- 【算法】BFS刷题总结
- android 计算运动速度,android – 计算参考真北的加速度
- easyui datagrid 绑定json对象属性的属性
- 关于C#内存释放的BUG?
- 修正CS2.0中的日历头显示错误
- ruoyi 多模块部署_大数据时代,独立部署的商城系统具有哪些优势?
- 设计师应该知道的配色工具,有效提高效率和审美
- 使用JavaScript和jQuery添加工具提示
- 1. SOAP 简介
- composer.install
- 自然语言理解gpt_GPT-3:自然语言处理的创造潜力
- php的UDP攻击,phpddos应对 最近新起一种udp flood的攻击形式
- IOS9 SDK下载、设备安装IOS9系统
- [uboot 移植]uboot 移植过程
- 扩展欧几里得模板+例题
- 【STC15】使用PCA0和PCA1做的模拟串口
- 波特率、比特率 与数据传输速率的区别
- 皮带撕裂检测matlab,基于机器视觉的皮带纵向撕裂检测方法
- YYText实现文本与下划线,删除线偏移
- windows服务创建
热门文章
- leetcode算法题--数组中数字出现的次数
- leetcode算法题-- 最长递增子序列的个数★
- android 开发数字键盘,Android 仿「微信」自定义数字键盘
- java a =a-=aa_Java求s=a+aa+aaa+aaaa+aa...a的值
- mysql c where_mysql where条件语句优化笔记
- 《Haskell趣学指南》笔记之I/O
- 【译】理解 JavaScript 中函数调用和 this
- svn提交及更新时的常见问题
- 浏览器对于前端的作用
- mysql之 mysql 5.6不停机主从搭建(一主一从基于GTID复制)