平時我們監聽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() );
}
});