一、布局优化
核心思想:减少布局文件的层级,层级少意味着 Android 绘制时的工作量减少,程序的性能自然就高了。
具体体现为以下几个方面:
二、绘制优化
核心思想:
View
的onDraw
方法避免执行大量操作,因为onDraw
方法可能会被频繁调用。
主要有两点:
onDraw
方法避免创建新的局部对象,因为onDraw
方法会被频繁调用,这样会在一瞬间产生大量临时对象,不仅占用过多内存而且还会导致频繁 GC,降低程序执行效率onDraw
方法不要做耗时任务,和循环操作,大量耗时任务会抢占 CPU 时间片,造成 View 绘制过程不流畅。
三、内存泄露优化
什么是内存泄露
内存泄漏本质上是因为生命周期较长的对象去引用生命周期较短的对象,导致生命周期短的对象无法被 GC 及时回收掉,从而导致被占用的内存无法被释放。
内存泄露的后果
Android 系统分配给每个应用的内存空间有限,如果程序长期运行最终可能会导致 OOM 内存溢出
如何优化
1. 避免写出有内存泄露的代码
以下是一些在 Android 中常见的内存泄露的代码场景
场景一: Activity 被静态变量引用
静态变量的生命周期与整个应用的生命周期一致,因此如果一个静态变量持有对某个 Activity
、Fragment
或其他上下文的引用,就会导致内存泄漏。
示例代码:
public class MemoryLeakActivity extends AppCompatActivity {
private static Context sContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_leak);
sContext = this; // 将 Activity 引用赋给静态变量
}
@Override
protected void onDestroy() {
super.onDestroy();
// 静态变量持有对 Activity 的引用,导致 Activity 无法被回收
}
}
解释:
- 静态变量
sContext
持有MemoryLeakActivity
的引用,即使Activity
被销毁,sContext
仍然指向已销毁的Activity
,造成内存泄漏。 - 解决方案:不要将
Activity
或Context
引用赋值给静态变量。若必须使用,可以使用WeakReference
来避免强引用。
场景二: 非静态内部类的静态实例
非静态内部类会持有外部类实例的引用,如果非静态内部类的实例是静态的,就会间接的长期维持着外部类的引用,阻止被系统回收。
示例代码:
public class StaticLeakActivity extends AppCompatActivity {
// 静态实例
private static NonStaticInnerClass inner;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (inner = null) {
inner = new NonStaticInnerClass();
}
}
// 非静态内部类
private class NonStatic