有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

            }
        });

共 (1) 个答案

  1. # 1 楼答案

    我认为这很慢,因为你在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{}方法发布

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

    第二种方法是,可以使用RxJavaDebounce操作符来处理这个问题

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

    您可以从here获取有关Debounce运算符的更多信息