最近互拾,做一個 標(biāo)題頭 封裝,是一個帶有 搜索功能的 標(biāo)題頭嚎幸;之前颜矿,結(jié)合學(xué)習(xí)的debounce 操作的特性來完成 延時、過濾等操作嫉晶,并用kotlin 重寫一邊邏輯骑疆,發(fā)現(xiàn)在 之前的 協(xié)變 田篇、逆變的地方 卡住,原來kotlin 的用 in箍铭、out來 分別表示 ‘逆變’ 和 ‘協(xié)變’ 泊柬。
自己的java 代碼(ref)
mRxManager.register(RxTextView.textChanges(searchEt)
.subscribeOn(AndroidSchedulers.mainThread()) // 對etKey[EditText]的監(jiān)聽操作 需要在主線程操作
.debounce(400, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
//對用戶輸入的關(guān)鍵字進(jìn)行過濾
.filter(new Predicate<CharSequence>() {
@Override
public boolean test(@io.reactivex.annotations.NonNull CharSequence charSequence) throws Exception {
if (charSequence.toString().trim().length() > 0) {
mRefreshLayout.setRefreshing(true);
}
return charSequence.toString().trim().length() > 0;
}
})
.observeOn(Schedulers.io())//對下游的Observable起作用
.switchMap(new Function<CharSequence, ObservableSource<QueryPagerBean>>() {
@Override
public Observable<QueryPagerBean> apply(@io.reactivex.annotations.NonNull CharSequence keyWord) throws Exception {
mKeyWord = keyWord.toString().trim();
LogUtils.d(TAG, "mKeyWord = " + mKeyWord);
mPageIndex = PAGER_BEGIN;
mPageSize = PAGER_SIZE;
String content = new Gson().toJson(new XxxxPagerReq(mKeyWord, mPageIndex, mPageSize, mUserInfo.checkToken));
LogUtils.d(TAG, "content = " + content);
return RetrofitCreateHelper.createApi(ApiService.class, RetrofitCreateHelper.PAGER_CONVERTER)
.getXxxxPagerByKeyword(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), content));
}
}))
由于是封裝 組合式控件,在switchMap操作符的網(wǎng)絡(luò)請求邏輯 诈火,是要暴露接口出去兽赁,讓外部自由發(fā)揮的,參數(shù)是需要一個Function 對象冷守,如圖(注意 它有一個逆變 刀崖、兩個協(xié)變)
屏幕快照 2018-06-28 上午11.55.38.png
現(xiàn)在看kotlin代碼
RxTextView.textChanges(qt_search_et)
.subscribeOn(AndroidSchedulers.mainThread()) // 對etKey[EditText]的監(jiān)聽操作 需要在主線程操作
.debounce(400, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
//對用戶輸入的關(guān)鍵字進(jìn)行過濾
.filter { charSequence ->
if (charSequence.toString().trim().isNotEmpty()) {
mSearchListener?.searchBeginning() // mRefreshLayout.setRefreshing(true)
}
charSequence.toString().trim().isNotEmpty() && mSearchListener != null && mSearchListener?.triggerSearchReq() != null
}
.observeOn(Schedulers.io())
// 傳遞一個函數(shù) 過來(triggerSearchReq)
.switchMap(mSearchListener?.triggerSearchReq())
.compose(RxHelper.rxSchedulerHelper())
// 數(shù)據(jù)處理,以及一些回調(diào)
.subscribe(object : Consumer<QueryPagerBean> {
override fun accept(queryPagerBean: QueryPagerBean) {
mSearchListener?.getSearchResult(queryPagerBean)
}
}, object : Consumer<Throwable> {
override fun accept(throwable: Throwable) {
mSearchListener?.searchError()
LogUtils.e(TAG, "call: throwable.toString() " + throwable.toString())
LogUtils.e(TAG, "call: throwable.toMessage() " + throwable.message)
throwable.printStackTrace()
}
}, object : Action {
override fun run() {
mSearchListener?.searchComplete()
}
})
private var mSearchListener: OnSearchListener? = null
fun setSearchListener(listener: OnSearchListener) {
mSearchListener = listener
}
interface OnSearchListener {
/** 點擊取消 */
fun onClickCancel()
/** 搜索編輯框文字清空拍摇,通知數(shù)據(jù)集也要清空 */
fun onClearClick()
/** 開始觸發(fā)搜索 */
fun searchBeginning()
/** 按 keyword 網(wǎng)絡(luò)請求 數(shù)據(jù)(關(guān)注這個方法的 返回值亮钦,是一個Function對象) */
fun triggerSearchReq(): Function<in CharSequence, out ObservableSource<out QueryPagerBean>>
/** 獲取 網(wǎng)絡(luò)數(shù)據(jù) 搜索結(jié)果 */
fun getSearchResult(queryPagerBean: QueryPagerBean)
/** 搜索異常 */
fun searchError()
/** 搜索完成 */
fun searchComplete()
}