EditText 在做搜索框时会出Bug,过快输入会造成页面刷新过快,之前的UI会冲掉之后的显示
处理办法时在规定时间内比如300ms内不做处理
方法1 Handler 方法
类似知乎搜索这样的,当此次输入超过设定的间隔时间就自动搜索。
有两种简单的实现方法供大家参考一下:
- Handler
- RxJava
Handler
监听EditText
的输入,每当文本变化,先检查Handler当前有无未处理的消息,有则移除该消息,然后用sendEmptyMessageDelayed
再发送一条延迟消息,如若文本超过延迟时间没有变化,该延迟消息就可以成功执行
private final int RC_SEARCH = 1;
private final int INTERVAL = 300; //输入时间间隔为300毫秒
private EditText mEtHandler;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == RC_SEARCH) {
handlerSearch();
}
}
};
mEtHandler.addTextChangedListener(new TextWatcher() {
@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) {
if (mHandler.hasMessages(RC_SEARCH)) {
mHandler.removeMessages(RC_SEARCH);
}
mHandler.sendEmptyMessageDelayed(RC_SEARCH, INTERVAL);
}
});
2
RxJava
学了RxJava后发现还有更简便的方法,即使用debounce
操作符处理不断产生的文本变化事件
debounce操作符对源Observable每产生一个结果后,如果在规定的间隔时间内没有别的结果产生,则把这个结果提交给订阅者处理,否则忽略该结果。
private EditText mEtRxJava;
private final int INTERVAL = 300; //输入时间间隔为300毫秒
RxTextView.textChangeEvents(mEtRxJava)
.debounce(INTERVAL, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<TextViewTextChangeEvent>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(TextViewTextChangeEvent textViewTextChangeEvent) {
rxJavaSearch();
}
});
Handler 会造成内存泄漏,所以推荐使用RxTextView的方法