PersistInt 减慢自定义首选项中的按钮响应
PersistInt slowing down button response in custom preference
我创建了一个自定义首选项,其中嵌入了两个按钮(这里我将 subclassed Button 作为 FastButton)。问题是执行 persistInt 来存储首选项会大大减慢按钮的响应速度。
我的想法是只在首选项的生命周期结束时执行 persistInt,但找不到合适的方法来覆盖(即首选项 class 没有像 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);
}
}
CheckBoxPreference
,通过其 TwoStatePreference
超类,使用 persistBoolean()
来保存首选项值,就像您使用 persistInt()
一样。在 CheckBox
的处理过程中,我没有发现明显的延迟。这意味着两件事之一:
我是穴居人,看不到明显的动画延迟等
CheckBoxPreference
没有出现您在 StepperPreference
中看到的问题
注意:这两种可能性并不相互排斥
如果我们假设#2 是正确的,那么还有其他事情正在发生。方法跟踪,以查看您在 persistInt()
的哪些地方花费了时间 "downstream",可能有助于确定 StepperPreference
.
的不同之处
根据您的评论,您有一个听众响应偏好更改,这就是导致响应缓慢的原因。 "Inline" 首选项,如 CheckBoxPreference
和 StepperPreference
,将比 DialogPreference
子类(如 ListPreference
)多 "twitchy",只是因为它需要更少的工作更改首选项状态(例如,一屏点击与 2+)。因此,听众需要更便宜。例如,您可能会推迟做重要的工作,直到用户离开 PreferenceFragment
,这样您就知道偏好值可能会稳定至少一秒钟左右。
我创建了一个自定义首选项,其中嵌入了两个按钮(这里我将 subclassed Button 作为 FastButton)。问题是执行 persistInt 来存储首选项会大大减慢按钮的响应速度。
我的想法是只在首选项的生命周期结束时执行 persistInt,但找不到合适的方法来覆盖(即首选项 class 没有像 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);
}
}
CheckBoxPreference
,通过其 TwoStatePreference
超类,使用 persistBoolean()
来保存首选项值,就像您使用 persistInt()
一样。在 CheckBox
的处理过程中,我没有发现明显的延迟。这意味着两件事之一:
我是穴居人,看不到明显的动画延迟等
CheckBoxPreference
没有出现您在StepperPreference
中看到的问题
注意:这两种可能性并不相互排斥
如果我们假设#2 是正确的,那么还有其他事情正在发生。方法跟踪,以查看您在 persistInt()
的哪些地方花费了时间 "downstream",可能有助于确定 StepperPreference
.
根据您的评论,您有一个听众响应偏好更改,这就是导致响应缓慢的原因。 "Inline" 首选项,如 CheckBoxPreference
和 StepperPreference
,将比 DialogPreference
子类(如 ListPreference
)多 "twitchy",只是因为它需要更少的工作更改首选项状态(例如,一屏点击与 2+)。因此,听众需要更便宜。例如,您可能会推迟做重要的工作,直到用户离开 PreferenceFragment
,这样您就知道偏好值可能会稳定至少一秒钟左右。