常规方案
convertView复用、使用ViewHolder
耗时任务异步处理
布局相关
减少布局层级、避免过度绘制
异步inflate或者X2C
图片相关
避免过大尺寸:GC频繁、内存抖动
滑动时取消加载
线程相关
使用线程池收敛线程,降低线程优先级
避免UI线程时间片被抢占
TextView优化
原因:面对复杂文本性能不佳
BoringLayout单行、StaticLayout多行
DynamicLayout可编辑
展示类StaticLayout即可,性能优于DynamicLayout
异步创建StaticLayout
public class CustomTextView extends View {
private String mText = "我是StaticLayout显示出来的文本";
private TextPaint mTextPaint;
private StaticLayout mStaticLayout;
public CustomTextView(Context context) {
super(context);
initLabelView();
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initLabelView();
}
private void initLabelView() {
mTextPaint = new TextPaint();
mTextPaint.setAntiAlias(true);
mTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
mTextPaint.setColor(Color.BLACK);
final int width = (int) mTextPaint.measureText(mText);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
mStaticLayout = new StaticLayout(mText, mTextPaint, (int) width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);
postInvalidate();
}
});
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(mStaticLayout != null){
canvas.save();
canvas.translate(getPaddingLeft(), getPaddingTop());
mStaticLayout.draw(canvas);
canvas.restore();
}
}
}
facebook/TextLayoutBuilder
其它
SysTrace跟踪
注意字符串拼接:使用StringBuilder 代替字符串直接相加