我正在开发一个单位转换器应用程序。它从EditText获取值,并将其与字符串数组中的值相乘,并再次存储在另一个数组中。然后在ListView中显示它。但EditText textwatcher工作缓慢。为什么呢?
etarea.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (etarea.getText().length() > 0){
double b = Double.parseDouble(etarea.getText().toString());
for(int i = 0; i <= valueSpinner.length -1; i++){
double a = Double.parseDouble(valueSpinner[i].toString());
double c = b*a;
DecimalFormat df = new DecimalFormat(decimal);
valueet[i] = df.format(c);
}
viewHolder.tvvalue.setText(valueet[i]);
tvareavalue.setText(valueet[posonclick]);
}else{
viewHolder.tvvalue.setText("Enter Value");
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
答案 0 :(得分:0)
我觉得它很慢,因为你在[{1}}的{{1}}方法中做了大量工作。
您可以为用户输入设置垃圾保留时间(例如1秒),在用户完成输入后,您可以完成工作。
有几种方法可以解决这个问题。
首先,您可以创建onTextChanged
并收听用户输入。在您的垃圾收集时间之后,您可以做您想做的事。
TextWatcher
创建一个可以完成工作的runnable。
Handler
并将其发布在// Create a handler.
private Handler handler = new Handler();
final Runnable runnable = new Runnable() {
@Override
public void run() {
if (etarea.getText().length() > 0){
double b = Double.parseDouble(etarea.getText().toString());
for(int i = 0; i <= valueSpinner.length -1; i++){
double a = Double.parseDouble(valueSpinner[i].toString());
double c = b*a;
DecimalFormat df = new DecimalFormat(decimal);
valueet[i] = df.format(c);
}
viewHolder.tvvalue.setText(valueet[i]);
tvareavalue.setText(valueet[posonclick]);
}else{
viewHolder.tvvalue.setText("Enter Value");
}
}
}
方法中。
TextWatcher's
对于第二种方式,您可以使用afterTextChanged
public void afterTextChanged(Editable s) {
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, YOUR_TRASH_HOLD_TIME);
}
运算符来处理此问题。
RxJava
您可以从here获取有关Debounce
运算符的更多信息。