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