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 效果很明显
网友评论