Java 带有Listview的Edittext上的Textwatcher运行缓慢

Java 带有Listview的Edittext上的Textwatcher运行缓慢,java,android,listview,textwatcher,Java,Android,Listview,Textwatcher,我正在开发一个单位转换器应用程序。它从EditText获取值,并将其与字符串数组中的值相乘,然后再次存储在另一个数组中。然后在ListView中显示它。但是EditText textwatcher的工作速度很慢。为什么? etarea.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start

我正在开发一个单位转换器应用程序。它从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) {

            }
        });
etarea.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
if(etarea.getText().length()>0){
double b=double.parseDouble(etarea.getText().toString());

对于(int i=0;i我认为它很慢,因为你在
onTextChanged
方法中做了大量的工作

您可以为用户输入设置一个垃圾桶等待时间(例如1秒),在用户完成输入后,您就可以开始工作了

有几种方法可以解决这个问题

首先,您可以创建一个
处理程序
并监听用户输入。在垃圾桶等待时间过后,您可以做您想做的事情

// Create a handler.
private Handler handler = new Handler();
创建一个执行您的工作的runnable

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");
                }
     }       
}
第二种方法是,可以使用
RxJava
Debounce
操作符来处理此问题

    // First create your observable
    Observable<OnTextChangeEvent> yourTextChangeObservable = WidgetObservable.text(yourInputText);

    // And create your subscription
    yourTextChangeSubscription = yourTextChangeObservable
      .debounce(YORU_TRASH_HOLD_TIME, TimeUnit.MILLISECONDS)
      .map(OnTextChangeEvent::text)
      .map(CharSequence::toString)
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(s -> {
                // do your work here with your input
            }
        );
//首先创建可观察对象
Observable yourTextChangeObservable=WidgetObservable.text(yourInputText);
//并创建您的订阅
yourTextChangeSubscription=yourTextChangeObservable
.debounce(YORU_TRASH_HOLD_TIME,TimeUnit.ms)
.map(OnTextChangeEvent::text)
.map(CharSequence::toString)
.observeOn(AndroidSchedulers.mainThread())
.订阅(s->{
//用你的输入在这里做你的工作
}
);

您可以从中获得有关
Debounce
运算符的更多信息。

我的建议是使用
Handler
Runnable
。将所有逻辑移到另一个方法,并像这样实现。最好的做法是等待用户完成键入。
    // First create your observable
    Observable<OnTextChangeEvent> yourTextChangeObservable = WidgetObservable.text(yourInputText);

    // And create your subscription
    yourTextChangeSubscription = yourTextChangeObservable
      .debounce(YORU_TRASH_HOLD_TIME, TimeUnit.MILLISECONDS)
      .map(OnTextChangeEvent::text)
      .map(CharSequence::toString)
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(s -> {
                // do your work here with your input
            }
        );