如何在 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 秒内被调用,那么 运行() 方法中的内容将被执行。
如果 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 秒内被调用,那么 运行() 方法中的内容将被执行。