欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android性能优化(三):响应优化

程序员文章站 2022-06-22 08:46:48
Android性能优化(三):响应优化1、为什么要进行响应优化?我在[布局优化]的文章中说过,Android系统每隔16ms会发出一个VSYNC信号来触发UI的渲染,如果在16ms内不能完成UI的渲染,界面就出现卡顿的情况。页面如果5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR,而BroadcastReceiver如果10秒钟之内还未执行完操作也会出现ANR。为了避免ANR,我们需要进行响应速度的优化。(https://blog.csdn.net/weixin_42574892/artic...

Android性能优化(三):响应优化

1、为什么要进行响应优化?
我在布局优化的文章中说过,Android系统每隔16ms会发出一个VSYNC信号来触发UI的渲染,如果在16ms内不能完成UI的渲染,界面就出现卡顿的情况。
(1)页面如果5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR;
(2)BroadcastReceiver如果10秒钟之内还未执行完操作也会出现ANR;
(3)主线程在执行Service的各个生命周期函数时20秒内没有执行完毕。
为了避免ANR,我们需要进行响应速度的优化。

2、如何查找ANR产生的原因?
当出现ANR时,系统会手机/data/anr/目录下生成traces.txt文件,我们可以使用adb命令将traces.txt文件取出来分析;

adb pull data/anr/traces.txt D:\log

通过AS开发工具也可以看到,如图:
Android性能优化(三):响应优化
3、如何避免ANR?

  1. 避免主线程堵塞:开辟单独的子线程来处理耗时阻塞事务。
  2. 避免CPU满负荷, I/O阻塞:文件读写或数据库操作不要在主线程中执行, 通过开辟子线程的方式异步执行。
  3. 避免内存泄漏导致ANR:内存泄漏会导致手机内存不足,造成ANR。
  4. 避免频繁的GC:频繁GC有两个原因:1、内存抖动, 即大量的对象被创建又在短时间内马上被释放.2、瞬间产生大量的对象会严重占用内存区域。

4、如何检测应用主线程卡顿?
检测工具:BlockCanary

  • BlockCanary是一个非侵入式式的性能监控函数库,用来监控应用主线程的卡顿。

  • 它的基本原理是利用主线程的消息队列处理机制,通过对比消息分发开始和结束的时间点来判断是否超过设定的时间,如果是,则判断为主线程卡顿。

接入方法:

  1. 在build.gradle中添加依赖;
implementation 'com.github.markzhai:blockcanary-android:1.5.0'

2.在application中进行安装初始化;

BlockCanary.install(this,new BlockContext()).start();

3.创建BlockContext类继承BlockCanaryContext;

import com.github.moduth.blockcanary.BlockCanaryContext;

public class BlockContext extends BlockCanaryContext {

    /**
     * Implement in your project.
     *
     * @return Qualifier which can specify this installation, like version + flavor.
     */
    @Override
    public String provideQualifier() {
        return "unknow";
    }


    /**
     * @return 用户ID
     */
    @Override
    public String provideUid() {
        return "uid";
    }

    /**
     * 网络类型
     * @return {@link String} like 2G, 3G, 4G, wifi, etc.
     */
    public String provideNetworkType() {
        return "unknown";
    }

    /**
     * 日志保存路径
     * @return
     */
    @Override
    public String providePath() {
        return "/Block/";
    }
}

在这里已经表示完成了。

本文地址:https://blog.csdn.net/weixin_42574892/article/details/106692594