平时我们监听EditText输入文本的编号是这样,只要输入字符串就会请求网络,当A还没反馈数据时,B请求又出去了,可能B先回来,然后A才会回来,这样会导致搜索内容的不准确,当然,我们也可以自己做处理 if if if if if if。。。
mEdittext.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) {
// do something
// e 根据用户输入的关键字 获取网络数据 关键字搜索
}
@Override
public void afterTextChanged(Editable s) {
}
});
当我们有了RxJava,一切都变得好简单,对输入的文本进行时间的分割,比如500毫秒才让它去请求一次网络,这样可以初步的避免数据混乱,也优化了app性能,防止数据不混乱可以与Edittext文本做一次比较
RxTextView.textChanges(mEdittext).filter(new Func1<CharSequence, Boolean>() { // 过滤,把输入字符串长度为0时过滤掉
@Override
public Boolean call(CharSequence charSequence) {
return charSequence.toString().trim().length() > 0 ;
}
}).debounce(500, TimeUnit.MILLISECONDS)
.flatMap(new Func1<CharSequence, Observable<List<String>>>() {
@Override
public Observable<List<String>> call(CharSequence charSequence) {
// do something
// e 根据用户输入的关键字 获取网络数据 关键字搜索
// 从网络获取数据
List<String> list = new ArrayList<String>();
list.add("Test");
return Observable.just(list);
}
}).subscribe(new Action1<List<String>>() {
@Override
public void call(List<String> strings) {
Log.e("Test",strings.toString() );
}
});