2017-07-14 28 views
0

我正在使用單位轉換器應用程序。它從EditText獲取值並將其與來自字符串數組的值相乘,並再次存儲在另一個數組中。然後在ListView中顯示它。但是EditText textwatcher運行緩慢。爲什麼?帶有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

我的建議是使用'Handler'和'Runnable'。 將所有邏輯移至其他方法,並像[this]一樣實現它(https://stackoverflow.com/a/14660979/8198240)。好的做法是等到用戶完成打字。 – arcticwhite

回答

0

我認爲這是緩慢的,因爲你是在爲你的TextWatcheronTextChanged方法做了繁重的工作。

您可以爲用戶輸入放置垃圾箱時間(例如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'safterTextChanged方法張貼。

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運營商。