package com.sohoffice.android.ui;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
/**
* This delayed text watcher intercept the text changed event and send notification to the observer
* after a wait threshold. If there's any subsequent text change, the watcher will reset the clock
* and wait for another wait threhold.<br/>
* <p/>
* This is useful when used with auto complete type of text field that the network / backend
* operation is not desired to be triggered immediately after a change.
* <p/>
* Created by Douglas Liu on 8/3/13.
*/
public class DelayedTextWatcher implements TextWatcher {
public static final String KEY_CHANGED_TEXT = "text";
public static final int WHAT_TEXT_CHANGED = 1;
private static final String Tag = DelayedTextWatcher.class.getSimpleName();
private Handler _waitingHandler;
NotificationRunnable _currentTask;
private long _waitThreshold;
private long lastChanged = 0;
private TextChangedListener _listener;
DelayedTextWatcher(TextChangedListener listener) {
this(listener, 2000);
}
/**
* Create a delayed text watcher.<br/>
*
* @param listener callback listener when condition is satisfied
* @param waitThreshold the time in milliseconds, that the watcher should wait before sending out the notification
*/
public DelayedTextWatcher(TextChangedListener listener, long waitThreshold) {
this._listener = listener;
this._waitThreshold = waitThreshold;
_waitingHandler = new Handler();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
synchronized (this) {
_waitingHandler.removeCallbacks(_currentTask);
Log.i(Tag, " enqueue notification: " + s);
_currentTask = new NotificationRunnable(s);
_waitingHandler.postDelayed(_currentTask, _waitThreshold);
}
}
private class NotificationRunnable implements Runnable {
private CharSequence payload;
public NotificationRunnable(CharSequence message) {
this.payload = message;
}
@Override
public void run() {
if (_listener != null) {
Log.i(Tag, " do notification: " + payload);
_listener.onTextChanged(payload);
}
}
}
public static interface TextChangedListener {
public void onTextChanged(CharSequence text);
}
}
03-30
4582
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
09-01