textwatcher运行缓慢

yxyvkwin  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(289)

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

            }
        });
owfi6suc

owfi6suc1#

我觉得很慢,因为你的工作很繁重 onTextChanged 你的方法 TextWatcher .
您可以为用户输入设置一个垃圾保持时间(例如1秒),在用户完成输入后,您就可以完成您的工作。
有几种方法可以解决这个问题。
首先,您可以创建 Handler 听用户输入。在你的垃圾停留时间后,你可以做你想做的事。

// 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");
                }
     }       
}

把它贴在你的邮箱里
TextWatcher's afterTextChanged 方法。

public void afterTextChanged(Editable s) {
      handler.removeCallbacks(runnable); 
      handler.postDelayed(runnable, YOUR_TRASH_HOLD_TIME);
}

第二种方法,你可以使用
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
            }
        );

你可以得到更多关于 Debounce 这里的接线员。

相关问题