Rxjava之RxTextView經(jīng)典詳解

大家都知道Rxjava神通廣大,無所不能,并有效避免Call Hell(回調(diào)地獄)模式,使大量的監(jiān)聽事件clickListener變換成流式編程,提高代碼閱讀性,提升代碼維護成本。今天我通過例子詳解Rxjava中的RxTextview詳解,讓你一舉搞懂Rxjava用法,語法以及操作實例(明白 簡單掌握)。

實際用戶場景舉例

根據(jù)用戶輸入的價格(價格范圍0.-1)、輸入的數(shù)量(10-無限)計算出總預(yù)計收入,如果寫錯了(舉例價格范圍錯誤、數(shù)量不對)賣出按鈕無效(disable).
如果用傳統(tǒng)的edittext.setOnChangeListner要加兩個,動態(tài)計算較為難以理解。用Rxjava 則合并兩個動態(tài)計算的Observable,最后動態(tài)算出結(jié)果,代碼如下。

  Observable<CharSequence> priceObservable = RxTextView.textChanges(priceEdit.getEditText());
        Observable<CharSequence> countObservable = RxTextView.textChanges(countEdit.getEditText());
        sellBtnSubscription = Observable.combineLatest(priceObservable, countObservable,
                (priceSequence, countSequence) -> {
                    if (priceSequence.toString().startsWith(".")) {
                        priceSequence = "0" + priceSequence;
                        priceEdit.setText("0.");
                        priceEdit.getEditText().setSelection(priceEdit.getText().length());
                    }
                    double inputPrice = StringUtils.isEmpty(priceSequence.toString()) ? 0 : Double.parseDouble(priceSequence.toString());
                    int inputCount = StringUtils.isEmpty(countSequence.toString()) ? 0 : Integer.parseInt(countSequence.toString());
                    return inputPrice > 0 && inputCount > 0;
                }).subscribe(new Observer<Boolean>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onNext(Boolean isSellBtnEnable) {
                sellBtn.setEnabled(isSellBtnEnable);
                String handFeetStr = "(含手續(xù)費)";
                if (isSellBtnEnable) {
                    double predictedIncome = Double.parseDouble(priceEdit.getText().toString()) * Integer.parseInt(countEdit.getText());
                    predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元");        //賣出聯(lián)豆的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
                    //( 含手續(xù)費 )
                    if (predictedIncome == 0) {
                        predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元");        //賣出聯(lián)豆的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
                    } else {
                        predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元" + handFeetStr);        //賣出聯(lián)豆的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
                    }
                } else {
                    predictedIncomeTv.setText(FormatUtil.formatMoney(0) + "元");        //賣出聯(lián)豆的預(yù)計收入
                }
            }
        });
    }

簡單詳解:

獲得兩個EditText的 可被觀察對象

獲得兩個edittext的可被觀察的(observable<CharSequence>對象

        Observable<CharSequence> priceObservable =
RxTextView.textChanges(priceEdit.getEditText());
        Observable<CharSequence> countObservable = 
RxTextView.textChanges(countEdit.getEditText());

綜合運算

動態(tài)算出 價格、數(shù)量是否合理

 sellBtnSubscription = Observable.combineLatest(priceObservable, countObservable,
                (priceSequence, countSequence) -> {
                    if (priceSequence.toString().startsWith(".")) {
                        priceSequence = "0" + priceSequence;
                        priceEdit.setText("0.");
                        priceEdit.getEditText().setSelection(priceEdit.getText().length());
                    }
                    double inputPrice = StringUtils.isEmpty(priceSequence.toString()) ? 0 : Double.parseDouble(priceSequence.toString());
                    int inputCount = StringUtils.isEmpty(countSequence.toString()) ? 0 : Integer.parseInt(countSequence.toString());
                    return inputPrice > 0 && inputCount > 0;
                }).subscribe(new Observer<Boolean>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onNext(Boolean isSellBtnEnable) {
                sellBtn.setEnabled(isSellBtnEnable);
                String handFeetStr = "(含手續(xù)費)";
                if (isSellBtnEnable) {
                    double predictedIncome = Double.parseDouble(priceEdit.getText().toString()) * Integer.parseInt(countEdit.getText());
                    predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元");        //賣出XX幣的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
                    //( 含手續(xù)費 )
                    if (predictedIncome == 0) {
                        predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元");        //賣出XX幣的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
                    } else {
                        predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元" + handFeetStr);        //賣出XX幣的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
                    }
                } else {
                    predictedIncomeTv.setText(FormatUtil.formatMoney(0) + "元");        //賣出聯(lián)豆的預(yù)計收入
                }
            }
        });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容