图片过大导致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)如下:
        <declare-styleable name="ImageViewNative">
        <attr name="srcNative" format="integer"/>
    </declare-styleable>
    
    • 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)在布局中使用自定义属性
        <com.yasin.androidndemo.view.ImageViewNative
        android:id="@+id/tv_logo"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginBottom="@dimen/margin_30dp"
        app:srcNative="@mipmap/ic_logo"
        />
    

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

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

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

最后

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,352评论 25 709
  • 原文地址:http://www.android100.org/html/201606/06/241682.html...
    AFinalStone阅读 4,661评论 0 1
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,723评论 0 17
  • Android开发中给我们提供了丰富的控件支持,可是产品是不断地发展更新的,产品经理的想法有时候也是比较BUG的。...
    MarcoHorse阅读 4,717评论 0 7
  • 仰望夜空 我看到了黑压压的翅膀 来自四面八方 驮着清冷月光 耳廓中回旋着扑腾声音 还有星光与大海的喧响 喜鹊在歌唱...
    萧烟阅读 2,744评论 4 4