图片过大导致Activity启动慢的问题

Activity启动慢的问题

前言:今天写个demo 无意间发现布居中只有两个常规的控件但是Activity的启动时间达到惊人的 5s184ms 如下

03-15 18:15:39.578 1093-1120/? I/ActivityManager: Displayed com.yasin.androidndemo/.activity.AnimationActivity: +5s184ms

然后我就不淡定了,这是什么鬼?怎么会这么长时间!

1. 定位问题

  • 1.首先把Activity中初始化的东西全部注释

    结果:运行时间并没有什么大变化 所以排除代码的问题

  • 2.注释父控件布局内的所有控件

    结果:时间变成AnimationActivity: +183ms 启动时间锐减啊,这说明启动慢是控件的问题

  • 3.一层一层放开注释 最终发现影响启动时间的是一个ImageView
    这是我突然想到 不会是==图片过大==吧!!!
    打开图片一看 还真是 1280*720 的分辨率

2. 解决问题

找到问题就好解决了这两有两种方案

  • 1 .通过代码压缩图片显示
    这样方式就不在ImageView中设置图片 在代码中通过压缩图片大小来显示图片(一种是自己写BitmapFactory 调整inSampleSize ,另一种是直接使用图片加载框架glide等)

  • 2 .自定义View
    写一个继承ImageView的View 在初始化中处理
    加载图片逻辑
    现在来实现下这个过程

    • 1)在values的 attrs.xml中创建一个属性集合ImageViewNative 和一个xml属性srcNative,并指定类型integer(也就是图片的类型在项目中是id)如下:
        
        
    
    
    • 2)在View的构造方法中解析相应标签并做处理
    public class ImageViewNative extends AppCompatImageView {
    ImageViewNative aNative;
    
    public ImageViewNative(Context context) {
        super(context);
    }
    
    public ImageViewNative(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }
    
    public ImageViewNative(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }
    
    private void init(Context context, AttributeSet attrs) {
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ImageViewNative);
        if (!isInEditMode()) {
            int img = array.getResourceId(R.styleable.ImageViewNative_srcNative, 0);
            if (img != 0)
                GlideUtils.displayNative(this, img);
          array.recycle();
        }
    }}
    

    : GlideUtils.displayNative(this, img); 是一段Glide图片加载的封装,你可以使用其他方式替代

    • 3)在布局中使用自定义属性
        
    

    使用自定义属性需要在布局文件中添加schemas声明

    xmlns:app="http://schemas.android.com/apk/res-auto"
    

自定义View可以在自定义的View中处理图片而不用去每个类中修改代码,另外它的扩展性比较强 如果不需要设置圆角等其他定制的话可以方便添加

最后

使用新的方案加载结果为 .activity.AnimationActivity: +264ms 效果很明显

你可能感兴趣的:(图片过大导致Activity启动慢的问题)