如何在 TextView 上次更改后的特定时间调用函数?

How to call a function a certain time after last change in TextView?

如果 textView 在特定时间(比如 25 秒)内没有任何变化,我只想调用一次函数。我不希望此函数在调用一次后被调用,而不管在首次调用后对 TextView 进行任何更改。

我试图通过使用计时器和 TextChangedListener 来实现这个目标。这是我目前的代码:

textResult.addTextChangedListener(new TextWatcher() {
 @Override
 public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

 }

 @Override
 public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
     //check to cancel timer when there is a new change
     shouldTimerReset = true;
 }

 @Override
 public void afterTextChanged(Editable editable) {

     CountDownTimer timer = new CountDownTimer(24000, 100) {
         @Override
         public void onTick(long l) {
             if (shouldTimerReset ){
                 cancel();
             }
         }

         @Override
         public void onFinish() {
             //call functions
             writeToFileExt(textResult.getText().toString());
             setButtonLabel(R.id.buttonReadAudio, "Read Audio");
             addItemsOnSpinnerModels();
             cancel();
             //Log.i ("Timer:", "Second timer");

         }
     }.start();

 }
});

我的想法是,每次更改后都会实例化一个新计时器,但由于检查,它将在下一次更改期间取消 onTextChanged,因此最后的一个计时器将保持活动状态,这将调用函数 onFinish。

但是,这个函数被调用了好几次,我不知道哪里出错了。是逻辑错误还是代码错误?我该如何解决?任何其他实现最终目标的建议也将不胜感激。我不一定需要使用计时器。最好的方法是什么?

在侦听器外部使用处理程序。

import android.os.Handler;

private final Handler handler;


...
handler = new Handler();
...
@Override
 public void afterTextChanged(Editable editable) {
    handler.removeCallbacksAndMessages(null);
    Runnable runnable = new Runnable(){
        void run(){
             writeToFileExt(textResult.getText().toString());
             setButtonLabel(R.id.buttonReadAudio, "Read Audio");
             addItemsOnSpinnerModels();
             cancel();
      }
    };
    handler.postDelayed(runnable,25000);
 }
...

您不需要调用任何 onTextChange 方法,因为紧接着调用了 afterTextChanged 方法。方法 handler.removeCallbacksAndMessages(null) 将取消队列中所有未决的 运行nables。文本更改后,新的 运行nable 将在 25 秒后设置为 运行。如果 afterTextChange 不会在 25 秒内被调用,那么 运行() 方法中的内容将被执行。