列表卡顿优化

392 阅读1分钟

常规方案

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 代替字符串直接相加