RxJava2 实战系列文章

RxJava2 实战知识梳理(1) – 后台执行耗时操作,实时通报 UI
更新
RxJava2 实战知识梳理(2) –
计算一段时间内数据的平均值
RxJava2 实战知识梳理(3) –
优化搜索联想功能
RxJava2 实战知识梳理(4) – 结合 Retrofit
请求新闻消息
RxJava2 实战知识梳理(5) –
简单和进阶的轮询操作
RxJava2 实战知识梳理(6) –
基于左类型的重试请求
RxJava2 实战知识梳理(7) – 基于 combineLatest
实现之输入表单验证
RxJava2 实战知识梳理(8) – 使用 publish + merge
优化先加载缓存,再念博网络数据的请过程
RxJava2 实战知识梳理(9) – 使用 timer/interval/delay
实现任务调度
RxJava2 实战知识梳理(10) – 屏幕旋转导致 Activity
重建时回升任务
RxJava2 实战知识梳理(11) –
检测网络状态并自行重试请求
RxJava2 实战知识梳理(12) – 实战讲解 publish & replay & share & refCount
& autoConnect
RxJava2 实战知识梳理(13) –
如何让错误产生时不自动停止订阅关系
RxJava2 实战知识梳理(14) – 在 token 过期时,刷新过期 token
并再度发起呼吁
RxJava2 实战知识梳理(15) – 实现一个概括的 MVP + RxJava + Retrofit
应用


一、前言

2.1 应用背景

在平时之采用中,我们常会受用户输入有信息,最普遍的实在注册或登录界面中,让用户输入用户名或者密码,但是我们常会针对用户名或者密码有一定的渴求,只有当它又满足要求时,才允用户展开下同样步的操作。

本条要求便事关到平等种植模型,即当多独地方监听变化,但是以一个地方开展联验证,如果证明成功,那么允许用户展开下一样步之操作,否则提示用户输入不科学。

经是例子,大家用学习到combineLatest操作符的用法。

2.2 示例

在下面这个示例中,包含了区区个输入框,分别指向利用户名和密码,它们的长要求分别吗2~84~16,如果两者都没错,那么登录按钮的文案变为“登录”,否则显示“用户称或密码无效”。

public class CombineLatestActivity extends AppCompatActivity {

    private EditText mEtName;
    private EditText mEtPassword;
    private Button mBtLogin;
    private PublishSubject<String> mNameSubject;
    private PublishSubject<String> mPasswordSubject;
    private CompositeDisposable mCompositeDisposable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_combine_latest);
        mEtName = (EditText) findViewById(R.id.et_name);
        mEtPassword = (EditText) findViewById(R.id.et_password);
        mBtLogin = (Button) findViewById(R.id.bt_login);
        mNameSubject = PublishSubject.create();
        mPasswordSubject = PublishSubject.create();
        mEtName.addTextChangedListener(new EditTextMonitor(mNameSubject));
        mEtPassword.addTextChangedListener(new EditTextMonitor(mPasswordSubject));
        Observable<Boolean> observable = Observable.combineLatest(mNameSubject, mPasswordSubject, new BiFunction<String, String, Boolean>() {

            @Override
            public Boolean apply(String name, String password) throws Exception {
                int nameLen = name.length();
                int passwordLen = password.length();
                return nameLen >= 2 && nameLen <= 8 && passwordLen >= 4 && passwordLen <= 16;
            }

        });
        DisposableObserver<Boolean> disposable = new DisposableObserver<Boolean>() {

            @Override
            public void onNext(Boolean value) {
                mBtLogin.setText(value ? "登录" : "用户名或密码无效");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }

        };
        observable.subscribe(disposable);
        mCompositeDisposable = new CompositeDisposable();
        mCompositeDisposable.add(disposable);
    }

    private class EditTextMonitor implements TextWatcher {

        private PublishSubject<String> mPublishSubject;

        EditTextMonitor(PublishSubject<String> publishSubject) {
            mPublishSubject = publishSubject;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            mPublishSubject.onNext(s.toString());
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCompositeDisposable.clear();
    }
}

以地方的事例中,我们先是创建了点滴单PublishSubject,分别用于用户称与密码的订阅,然后通过combineLatest针对当下简单个PublishSubject展开结合。这样,当任意一个PublishSubject发送事件之后,就会见回调combineLatest末一个函数的apply办法,该方法会取到每个被考察的PublishSubject终极一软发射的多寡,我们由此该数据开展认证。

末尾运行的机能也:

老二、示例解析

2.1 combineLatest 原理

combineLatest的规律图如下所示:

combineLatest 原理图

拖欠操作符接受多单Observable和一个函数作为参数,并且函数的签为这些Observable放的数据类型。当以上的随意一个Observable发出数量之后,会失掉得其它Observable
新近同样涂鸦发出的数码,回调到函数当中,但是该函数回调的前提是有的Observable足足发射了一个数额项

2.2 combineLatest 和 zip 的区别

zipcombineLatest吸收的参数格式相同,我们当 RxJava2
实战知识梳理(4) – 结合 Retrofit
请求新闻消息
中因故她来落实等待多只Observable犹发出后才开展数量的组成,回顾一下它的法则图:

zip 原理图

zipcombineLatest的界别在:

  • zip大凡当里头一个Observable发出数量项后,组合具有Observable无限早一个休吃做的多少项,也就是说,组合后的Observable发出的先后n个数据项,必然是每个源由Observable分别发射的次序n独数据项整合的。
  • combineLatest则是以里头一个Observable发出数量项后,组合具有Observable所发出的终极一个多少项(前提是具备的Observable且至少发射了一个数量项)。

重复多篇,欢迎访问我的 Android 知识梳理系列:

  • Android
    知识梳理目录:http://www.jianshu.com/p/fd82d18994ce
  • 个人主页:http://lizejun.cn
  • 私知识总结目录:http://lizejun.cn/categories/
网站地图xml地图