背景
在trace中查看rv的item创建过程,发现一个耗时的地方,通过查看组件id发现是一个imageview,图片的解码耗时了。
图片解码耗时
我把这个图片拿出来,放到空的demo中做实验,代码大概是这样的。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ImgActivity">
<ImageView
android:id="@+id/iv_test_view"
android:layout_width="199dp"
android:layout_height="95dp"
android:src="@drawable/detail_player_img_vip"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
整个页面只有一个图片,这样可以排期其他干扰。
也就是页面有一个iv,然后src设置了一张图片,图片就是发现耗时的那张。
现在重新抓一次trace。看看耗时情况。
如果直接xml设置src,这个耗时有点离谱了。这样在rv创建item的时候是很致命的。
我们换glide加载图片试试。
package com.debug.tvdemo;
import android.os.Bundle;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import com.bumptech.glide.Glide;
public class ImgActivity extends AppCompatActivity {
private ImageView ivTestView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_img);
//android:src="@drawable/detail_player_img_vip"
initView();
}
private void initView() {
ivTestView = (ImageView) findViewById(R.id.iv_test_view);
Glide.with(this).load(R.drawable.detail_player_img_vip).into(ivTestView);
}
}
抓一次trace
可以看到主线程不在解码图片了,切换到glide-disk中处理,也就是glide开的线程处理。
不要少看几十ms,应用想要丝滑,就是这样一点点挤出来的。最近一直在搞优化,趁有时间就多写点笔记!
总结
- 肉眼看不出卡顿不代表卡顿,特别是tv,不像手机可以触摸
- 如果你有台低配设备,那恭喜你,你会对卡顿更加敏感,离真相更近
- trace的抓取,分析