美文网首页Android攻略
Rxjava之RxTextView经典详解

Rxjava之RxTextView经典详解

作者: NoValue | 来源:发表于2018-07-20 11:04 被阅读490次

大家都知道Rxjava神通广大,无所不能,并有效避免Call Hell(回调地狱)模式,使大量的监听事件clickListener变换成流式编程,提高代码阅读性,提升代码维护成本。今天我通过例子详解Rxjava中的RxTextview详解,让你一举搞懂Rxjava用法,语法以及操作实例(明白 简单掌握)。

实际用户场景举例

根据用户输入的价格(价格范围0.-1)、输入的数量(10-无限)计算出总预计收入,如果写错了(举例价格范围错误、数量不对)卖出按钮无效(disable).
如果用传统的edittext.setOnChangeListner要加两个,动态计算较为难以理解。用Rxjava 则合并两个动态计算的Observable,最后动态算出结果,代码如下。

  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 = "(含手续费)";
                if (isSellBtnEnable) {
                    double predictedIncome = Double.parseDouble(priceEdit.getText().toString()) * Integer.parseInt(countEdit.getText());
                    predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元");        //卖出联豆的预计收入(没有去除手续费的预估收入)
                    //( 含手续费 )
                    if (predictedIncome == 0) {
                        predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元");        //卖出联豆的预计收入(没有去除手续费的预估收入)
                    } else {
                        predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元" + handFeetStr);        //卖出联豆的预计收入(没有去除手续费的预估收入)
                    }
                } else {
                    predictedIncomeTv.setText(FormatUtil.formatMoney(0) + "元");        //卖出联豆的预计收入
                }
            }
        });
    }

简单详解:

获得两个EditText的 可被观察对象

获得两个edittext的可被观察的(observable<CharSequence>对象

        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 = "(含手续费)";
                if (isSellBtnEnable) {
                    double predictedIncome = Double.parseDouble(priceEdit.getText().toString()) * Integer.parseInt(countEdit.getText());
                    predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元");        //卖出XX币的预计收入(没有去除手续费的预估收入)
                    //( 含手续费 )
                    if (predictedIncome == 0) {
                        predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元");        //卖出XX币的预计收入(没有去除手续费的预估收入)
                    } else {
                        predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元" + handFeetStr);        //卖出XX币的预计收入(没有去除手续费的预估收入)
                    }
                } else {
                    predictedIncomeTv.setText(FormatUtil.formatMoney(0) + "元");        //卖出联豆的预计收入
                }
            }
        });

相关文章

  • Rxjava之RxTextView经典详解

    大家都知道Rxjava神通广大,无所不能,并有效避免Call Hell(回调地狱)模式,使大量的监听事件click...

  • RxJava文章收集

    《给 Android 开发者的 RxJava 详解》 谜之RxJava (二) —— Magic Lift 谜之R...

  • RxJava详解之执行原理(四)

    RxJava详解之执行原理(四) 前面几篇文章介绍了RxJava的基本使用,也说了RxJava的优缺点。下面我们就...

  • 【Android学习】RxJava + Retrofit

    RxJava 给 Android 开发者的 RxJava 详解RxJava 示例工程 Retrofit Retro...

  • RxJava

    给 Android 开发者的 RxJava 详解 RxJava 与 Retrofit 结合的最佳实践 RxJava...

  • `RxJava Android`开发全系列

    RxJava Android开发全系列 有关RxJava的介绍请看RxJava详解系列 要说16年android开...

  • 学习资料整理

    Rxjava 教程 给 Android 开发者的 RxJava 详解: https://gank.io/post/...

  • RxJava

    给 Android 开发者的 RxJava 详解

  • RxJava学习笔记

    参阅给 Android 开发者的 RxJava 详解什么是函数式编程RxJava 2.0 全新来袭基于RxJava...

  • RxJava详解之操作符执行原理(五)

    RxJava详解之操作符执行原理(五) 上一篇文章介绍了RxJava的执行原理。下面继续介绍一下操作符的执行原理,...

网友评论

    本文标题:Rxjava之RxTextView经典详解

    本文链接:https://www.haomeiwen.com/subject/exdfmftx.html