PersistInt在自定义首选项中减慢按钮响应速度

时间:2016-04-19 19:35:59

标签: android android-preferences

我已经创建了一个自定义首选项,它嵌入了两个按钮(这里我将Button子类化为FastButton)。问题是执行persistInt来存储首选项会大大减慢按钮的响应速度。

我有一个概念,即在偏好的生命周期结束时只执行persistInt,但找不到合适的方法来覆盖(即没有像Preference类的onPause()那样。)

我尝试使用AsyncTask将persistInt移出UI线程也没有成功。

有关如何减轻persistInt对我的UI响应的影响的任何建议?

public final class StepperPreference extends Preference {

public int mCurrentValue = 1;
public int maxValue = Integer.MAX_VALUE;
public int minValue = Integer.MIN_VALUE;
private TextView mText;

private FastButton plusButton;
private FastButton minusButton;

public StepperPreference(Context context) {
    super(context);
}

public StepperPreference(Context context, AttributeSet attrs) {

    super(context, attrs);
    parseCustomAttributes(attrs);
}

public StepperPreference(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    parseCustomAttributes(attrs);
}

public void setmCurrentValue(int value) {
    if (mCurrentValue != value) {
        mCurrentValue = value;
        persistInt(mCurrentValue);
    }
}

private void parseCustomAttributes(AttributeSet attrs) {

    int maxValueAttrInt=Integer.MAX_VALUE;
    int minValueAttrInt=Integer.MIN_VALUE;

    if (attrs!=null) {
        TypedArray a=getContext()
                .obtainStyledAttributes(attrs,
                        R.styleable.StepperPreference,
                        0, 0);

        maxValueAttrInt = a.getInt(R.styleable.StepperPreference_maxValue, Integer.MAX_VALUE);
        minValueAttrInt = a.getInt(R.styleable.StepperPreference_minValue, Integer.MIN_VALUE);
        a.recycle();
    }

    if (maxValueAttrInt > minValueAttrInt) {
        maxValue = maxValueAttrInt;
        minValue = minValueAttrInt;
    }
}

@Override
protected View onCreateView(ViewGroup parent) {
    LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View view = (View) li.inflate(R.layout.stepper_preference, parent, false);

    mText = (TextView) view.findViewById(R.id.text_view);
    Context context = getContext();

    int localDefaultValue = 0;
    mCurrentValue = getPersistedInt(localDefaultValue);
    mText.setText(Integer.toString(mCurrentValue));


    plusButton = (FastButton) view.findViewById(R.id.plus_button);
    plusButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if (mCurrentValue < maxValue) {
                mCurrentValue++;
                mText.setText(Integer.toString(mCurrentValue));
                persistInt(mCurrentValue);

            }
        }
    });

    minusButton = (FastButton) view.findViewById(R.id.minus_button);
    minusButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if (mCurrentValue > minValue) {
                mCurrentValue--;
                mText.setText(Integer.toString(mCurrentValue));
                persistInt(mCurrentValue);
            }
        }
    });

    return view;
}

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
    int localDefaultValue = 0;
    Object result = a.getInt(index, localDefaultValue);
    return result;
}

@Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
    int localDefaultValue = 0;
    setmCurrentValue(restoreValue ? this.getPersistedInt(localDefaultValue) : (int) defaultValue);
}

}

1 个答案:

答案 0 :(得分:1)

CheckBoxPreference通过其TwoStatePreference超类使用persistBoolean()来保存偏好值,就像使用persistInt()一样。我在处理CheckBox时没有发现明显的延迟。这意味着以下两件事之一:

  1. 我是一个穴居人,无法看到明显的动画延迟等等

  2. CheckBoxPreference未显示您在StepperPreference

  3. 中看到的问题

    注意:这两种可能性并不相互排斥

    如果我们假设#2是正确的,那么还有其他事情正在发生。方法跟踪,以查看您从persistInt()“下游”花费时间的位置,可能对确定StepperPreference的不同之处非常有用。

    根据你的评论,你有一个听众回应偏好变化,这就是造成缓慢回应的原因。 “内联”首选项(如CheckBoxPreferenceStepperPreference)比DialogPreference子类(如ListPreference更加“抽象”,仅仅因为更改首选项状态所需的工作量更少(例如,一个屏幕点击与2+)。结果,听众需要更便宜。例如,在用户离开PreferenceFragment之前,您可能会暂停执行重要工作,因此您知道优先级值可能至少稳定一秒左右。