Android 性能优化

一、布局优化

核心思想:减少布局文件的层级,层级少意味着 Android 绘制时的工作量减少,程序的性能自然就高了。

具体体现为以下几个方面:
在这里插入图片描述

二、绘制优化

核心思想:ViewonDraw 方法避免执行大量操作,因为 onDraw 方法可能会被频繁调用。

主要有两点:

  1. onDraw 方法避免创建新的局部对象,因为 onDraw 方法会被频繁调用,这样会在一瞬间产生大量临时对象,不仅占用过多内存而且还会导致频繁 GC,降低程序执行效率
  2. onDraw 方法不要做耗时任务,和循环操作,大量耗时任务会抢占 CPU 时间片,造成 View 绘制过程不流畅。
    在这里插入图片描述

三、内存泄露优化

什么是内存泄露

内存泄漏本质上是因为生命周期较长的对象去引用生命周期较短的对象,导致生命周期短的对象无法被 GC 及时回收掉,从而导致被占用的内存无法被释放。

内存泄露的后果

Android 系统分配给每个应用的内存空间有限,如果程序长期运行最终可能会导致 OOM 内存溢出

如何优化

在这里插入图片描述

1. 避免写出有内存泄露的代码

以下是一些在 Android 中常见的内存泄露的代码场景

场景一: Activity 被静态变量引用

静态变量的生命周期与整个应用的生命周期一致,因此如果一个静态变量持有对某个 ActivityFragment 或其他上下文的引用,就会导致内存泄漏。

示例代码:

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,造成内存泄漏。
  • 解决方案:不要将 ActivityContext 引用赋值给静态变量。若必须使用,可以使用 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值