干货! RxJava 常见使用场景及小技巧!

正文部分:

RxJava+RxBinding在View上的一些使用技巧

//防抖操作  防止多次点击

注"依赖RxView

 
 
  1.        RxView.clicks(btn_click)
  2.                .throttleFirst(3, TimeUnit.SECONDS)
  3.                .subscribe(new Action1<Void>() {
  4.                    @Override
  5.                    public void call(Void aVoid) {
  6.                        Toast.makeText(getActivity(), R.string.des_demo_not_more_click, Toast.LENGTH_SHORT).show();
  7.                    }
  8.                });

//CheckBox状态更新-响应式界面

 
 
  1.        RxCompoundButton.checkedChanges(checkBox2)
  2.                .subscribe(new Action1<Boolean>() {
  3.                    @Override
  4.                    public void call(Boolean aBoolean) {
  5.                        //dosome...
  6.                    }
  7.                });

//使用debounce做textSearch   如:可以使用debounce减少频繁的网络请求。避免每输入(删除)一个字就做一次联想

 
 
  1. RxTextView.textChangeEvents(inputEditText)  
  2.      .debounce(400, TimeUnit.MILLISECONDS)  
  3.      .observeOn(AndroidSchedulers.mainThread())  
  4.      .subscribe(new Observer<TextViewTextChangeEvent>() ...


RxJava轮询器:interval

////延时3000 ,每间隔3000

 
 
  1.    private Subscription subscribe_auto;
  2. //开启轮询
  3.    private void autoLoop() {
  4.        if (subscribe_auto == null || subscribe_auto.isUnsubscribed()) {
  5.            subscribe_auto = Observable.interval(3000, 3000, TimeUnit.MILLISECONDS)
  6.                                            //延时3000 ,每间隔3000,时间单位
  7.                    .observeOn(AndroidSchedulers.mainThread())
  8.                    .subscribe(new Action1<Long>() {
  9.                        @Override
  10.                        public void call(Long aLong) {
  11.                            //do...
  12.                        }
  13.                    });
  14.        }
  15.    }
  16. //关闭询器
  17.     void stopLoop() {
  18.        if (subscribe_auto != null && !subscribe_auto.isUnsubscribed()) {
  19.            subscribe_auto.unsubscribe();
  20.        }

RxJava定时器:timer

 
 
  1.        Observable.timer(3000 , TimeUnit.MILLISECONDS)
  2.                .observeOn(AndroidSchedulers.mainThread())
  3.                .subscribe(new Action1<Long>() {
  4.                    @Override
  5.                    public void call(Long aLong) {
  6.                        iv_welcome.setVisibility(View.VISIBLE);
  7.                        //do...
  8.                    }
  9.                });


RxJava操作符:Buffer

//点击按钮达到指定次数后,触发某事件

 
 
  1.        RxView.clicks(btn_buffer_count)
  2.                .buffer(3)
  3.                .compose(this.<List<Void>>bindToLifecycle())
  4.                .observeOn(AndroidSchedulers.mainThread())
  5.                .subscribe(new Action1<List<Void>>() {
  6.                    @Override
  7.                    public void call(List<Void> voids) {
  8.                        Toast.makeText(BufferFragment.this.getActivity(), R.string.des_demo_buffer_count, Toast.LENGTH_SHORT).show();
  9.                    }
  10.                });

//案例:输入123456 , 两两发送,并跳过之后的一个数据,即最后订阅者接收到[1,2] [4,5] 两个数据包裹, 3和6 分别被跳过

 
 
  1.        Observable.from(chs)
  2.                .buffer(2, 3)
  3.                .observeOn(AndroidSchedulers.mainThread())
  4.                .subscribe(new Action1<List<Character>>() {
  5.                    @Override
  6.                    public void call(List<Character> characters) {
  7.                        //do....
  8.                    }
  9.                });

R


R


RxJava combineLatest合并最近N个结点

//例如:注册的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注册按钮

 
 
  1. Observable<CharSequence> _emailChangeObservable = RxTextView.textChanges(_email).skip(1);  
  2. Observable<CharSequence> _passwordChangeObservable = RxTextView.textChanges(_password).skip(1);  
  3. Observable<CharSequence>   _numberChangeObservable = RxTextView.textChanges(_number).skip(1);  
  4.  
  5. Observable.combineLatest(_emailChangeObservable,  
  6.              _passwordChangeObservable,  
  7.              _numberChangeObservable,  
  8.              new Func3<CharSequence, CharSequence, CharSequence, Boolean>() {  
  9.                  @Override  
  10.                  public Boolean call(CharSequence newEmail,  
  11.                                      CharSequence newPassword,  
  12.                                      CharSequence newNumber) {  
  13.  
  14.                      Log.d("xiayong",newEmail+" "+newPassword+" "+newNumber);  
  15.                      boolean emailValid = !isEmpty(newEmail) &&  
  16.                                           EMAIL_ADDRESS.matcher(newEmail).matches();  
  17.                      if (!emailValid) {  
  18.                          _email.setError("Invalid Email!");  
  19.                      }  
  20.  
  21.                      boolean passValid = !isEmpty(newPassword) && newPassword.length() > 8;  
  22.                      if (!passValid) {  
  23.                          _password.setError("Invalid Password!");  
  24.                      }  
  25.  
  26.                      boolean numValid = !isEmpty(newNumber);  
  27.                      if (numValid) {  
  28.                          int num = Integer.parseInt(newNumber.toString());  
  29.                          numValid = num > 0 && num <= 100;  
  30.                      }  
  31.                      if (!numValid) {  
  32.                          _number.setError("Invalid Number!");  
  33.                      }  
  34.  
  35.                      return emailValid && passValid && numValid;  
  36.  
  37.                  }  
  38.              })//  
  39.              .subscribe(new Observer<Boolean>() {  
  40.                  @Override  
  41.                  public void onCompleted() {  
  42.                      log.d("completed");  
  43.                  }  
  44.  
  45.                  @Override  
  46.                  public void onError(Throwable e) {  
  47.                     log.d("Error");  
  48.                  }  
  49.  
  50.                  @Override  
  51.                  public void onNext(Boolean formValid) {  
  52.                     _btnValidIndicator.setEnabled(formValid);    
  53.                  }  
  54.              });

RxJava操作符:zip数据合并操作

//合并联系人  模拟一部分数据来自本地,一部分来自网络

 
 
  1.  /**
  2.     * 模拟网络联系人列表
  3.     */
  4.    private Observable<List<Contacter>> queryContactsForNet() {
  5.        return Observable.create(new Observable.OnSubscribe<List<Contacter>>() {
  6.            @Override
  7.            public void call(Subscriber<? super List<Contacter>> subscriber) {
  8.                try {
  9.                    Thread.sleep(3000);
  10.                } catch (InterruptedException e) {
  11.                    e.printStackTrace();
  12.                }
  13.                ArrayList<Contacter> contacters = new ArrayList<>();
  14.                contacters.add(new Contacter("net:Zeus"));
  15.                contacters.add(new Contacter("net:Athena"));
  16.                contacters.add(new Contacter("net:Prometheus"));
  17.                subscriber.onNext(contacters);
  18.                subscriber.onCompleted();
  19.            }
  20.        });
  21.    }
  22.    /**
  23.     * 模拟手机本地联系人查询
  24.     */
  25.    private Observable<List<Contacter>> queryContactsFromLocation() {
  26.        return Observable.create(new Observable.OnSubscribe<List<Contacter>>() {
  27.            @Override
  28.            public void call(Subscriber<? super List<Contacter>> subscriber) {
  29.                ArrayList<Contacter> contacters = new ArrayList<>();
  30.                contacters.add(new Contacter("location:张三"));
  31.                contacters.add(new Contacter("location:李四"));
  32.                contacters.add(new Contacter("location:王五"));
  33.                subscriber.onNext(contacters);
  34.                subscriber.onCompleted();
  35.            }
  36.        });
  37.    }
  38. Observable.zip(
  39.                queryContactsFromLocation(),
  40.                queryContactsForNet(),
  41.                new Func2<List<Contacter>, List<Contacter>, List<Contacter>>() {
  42.                    @Override
  43.                    public List<Contacter> call(List<Contacter> contacters, List<Contacter> contacters2) {
  44.                        contacters.addAll(contacters2);
  45.                        return contacters;
  46.                    }
  47.                }
  48.        ).subscribeOn(Schedulers.io())
  49.                .observeOn(AndroidSchedulers.mainThread())
  50.                .subscribe(new Action1<List<Contacter>>() {
  51.                    @Override
  52.                    public void call(List<Contacter> contacters) {
  53.                        initPage(contacters);
  54.                    }
  55.                });

RxJava操作符:merge合并操作符

//模拟网络请求中,1秒后先显示本地数据,3秒后显示网络数据

 
 
  1.   private Observable<List<Contacter>> getDataFromNet() {
  2.        return Observable.create(new Observable.OnSubscribe<List<Contacter>>() {
  3.            @Override
  4.            public void call(Subscriber<? super List<Contacter>> subscriber) {
  5.                try {
  6.                    Thread.sleep(3000);
  7.                } catch (InterruptedException e) {
  8.                    e.printStackTrace();
  9.                }
  10.                ArrayList<Contacter> contacters = new ArrayList<>();
  11.                contacters.add(new Contacter(NET + "Zeus"));
  12.                contacters.add(new Contacter(NET + "Athena"));
  13.                contacters.add(new Contacter(NET + "Prometheus"));
  14.               // subscriber.onError(new Throwable("模拟出错"));
  15.                subscriber.onNext(contacters);
  16.                subscriber.onCompleted();
  17.            }
  18.        });
  19.    }
  20.    private Observable<List<Contacter>> getDataFromLocation() {
  21.        return Observable.create(new Observable.OnSubscribe<List<Contacter>>() {
  22.            @Override
  23.            public void call(Subscriber<? super List<Contacter>> subscriber) {
  24.                try {
  25.                    Thread.sleep(1000);
  26.                } catch (InterruptedException e) {
  27.                    e.printStackTrace();
  28.                }
  29.                List<Contacter> datas = new ArrayList<>();
  30.                datas.add(new Contacter(LOCATION + "张三"));
  31.                datas.add(new Contacter(LOCATION + "李四"));
  32.                datas.add(new Contacter(LOCATION + "王五"));
  33.                subscriber.onNext(datas);
  34.                subscriber.onCompleted();
  35.        
  36. //合并请求

  37. Zip,还望大家不要跟Merge操作符混淆,Merge/concat其实只是将多个Obsevables的输出序列变为一个,方便订阅者统一处理,对于订阅者来说就仿佛只订阅了一个观察者一样。

  38.        Observable.concat(
  39.                getDataFromLocation(),
  40.                getDataFromNet()
  41.        ).subscribeOn(Schedulers.io())
  42.                .observeOn(AndroidSchedulers.mainThread())
  43.                .subscribe(new Action1<List<Contacter>>() {
  44.                    @Override
  45.                    public void call(List<Contacter> contacters) {
  46.                        initPage(contacters);
  47.                    }
  48.                }, new Action1<Throwable>() {
  49.                    @Override
  50.                    public void call(Throwable throwable) {
  51.                        XgoLog.e(throwable.getMessage());
  52.                    }
  53.                }, new Action0() {
  54.                    @Override
  55.                    public void call() {
  56.                        XgoLog.d("onCompleted()");
  57.                    }
  58.                });


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值