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{

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    class MyHandler extends Handler{
        @Override
        public 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);
    }
    @Override
    public 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完成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值