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

时间:2016-06-15 17:41:06

标签: java android timer textview countdowntimer

如果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。

然而,该功能被多次调用,我不知道我哪里出错了。逻辑或代码中是否有错误?我该如何解决?任何其他建议,以实现最终目标也将不胜感激。我不一定需要使用计时器。什么是最好的方法?

1 个答案:

答案 0 :(得分:1)

在侦听器之外使用Handler。

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上调用annything,因为之后调用了afterTextChanged方法。方法handler.removeCallbacksAndMessages(null)将取消que中的所有挂起的runnable。文本更改后,新的runnable将设置为在25秒内运行。如果在25秒内没有调用afterTextChange,则会执行run()方法中的内容。