安卓RxJava第四弹之 应用场景
来源:互联网 发布:安卓淘宝客助手 编辑:程序博客网 时间:2024/04/29 03:03
一.注册的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注册按钮。
Observable<CharSequence> _emailChangeObservable = RxTextView.textChanges(_email).skip(1);Observable<CharSequence> _passwordChangeObservable = RxTextView.textChanges(_password).skip(1);Observable<CharSequence> _numberChangeObservable = RxTextView.textChanges(_number).skip(1);Observable.combineLatest(_emailChangeObservable, _passwordChangeObservable, _numberChangeObservable, new Func3<CharSequence, CharSequence, CharSequence, Boolean>() { @Override public Boolean call(CharSequence newEmail, CharSequence newPassword, CharSequence newNumber) { Log.d("xiayong",newEmail+" "+newPassword+" "+newNumber); boolean emailValid = !isEmpty(newEmail) && EMAIL_ADDRESS.matcher(newEmail).matches(); if (!emailValid) { _email.setError("Invalid Email!"); } boolean passValid = !isEmpty(newPassword) && newPassword.length() > 8; if (!passValid) { _password.setError("Invalid Password!"); } boolean numValid = !isEmpty(newNumber); if (numValid) { int num = Integer.parseInt(newNumber.toString()); numValid = num > 0 && num <= 100; } if (!numValid) { _number.setError("Invalid Number!"); } return emailValid && passValid && numValid; } })// .subscribe(new Observer<Boolean>() { @Override public void onCompleted() { log.d("completed"); } @Override public void onError(Throwable e) { log.d("Error"); } @Override public void onNext(Boolean formValid) { _btnValidIndicator.setEnabled(formValid); } });二.Scheduler线程切换
Observable.just(1, 2, 3, 4) .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程 .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程 .subscribe(new Action1<Integer>() { @Override public void call(Integer number) { Log.d(tag, "number:" + number); } });三.使用debounce做textSearch
用简单的话讲就是当N个结点发生的时间太靠近(即发生的时间差小于设定的值T),debounce就会自动过滤掉前N-1个结点。
比如在做百度地址联想的时候,可以使用debounce减少频繁的网络请求。避免每输入(删除)一个字就做一次联想
RxTextView.textChangeEvents(inputEditText) .debounce(400, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<TextViewTextChangeEvent>() { @Override public void onCompleted() { log.d("onComplete"); } @Override public void onError(Throwable e) { log.d("Error"); } @Override public void onNext(TextViewTextChangeEvent onTextChangeEvent) { log.d(format("Searching for %s", onTextChangeEvent.text().toString())); }});
四.使用merge合并两个数据源。
Observable.merge(getDataFromFile(), getDataFromNet()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { log.d("done loading all data"); } @Override public void onError(Throwable e) { log.d("error"); } @Override public void onNext(String data) { log.d("all merged data will pass here one by one!") });五.使用concat和first做缓存
依次检查memory、disk和network中是否存在数据,任何一步一旦发现数据后面的操作都不执行。
Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { if (memoryCache != null) { subscriber.onNext(memoryCache); } else { subscriber.onCompleted(); } }});Observable<String> disk = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { String cachePref = rxPreferences.getString("cache").get(); if (!TextUtils.isEmpty(cachePref)) { subscriber.onNext(cachePref); } else { subscriber.onCompleted(); } }});Observable<String> network = Observable.just("network");//依次检查memory、disk、networkObservable.concat(memory, disk, network).first().subscribeOn(Schedulers.newThread()).subscribe(s -> { memoryCache = "memory"; System.out.println("--------------subscribe: " + s);});
三级缓存的完整代码在github: https://github.com/Chaoba/RxImageloader
六.使用timer做定时操作。当有“x秒后执行y操作”类似的需求的时候,想到使用timer
Observable.timer(2, TimeUnit.SECONDS) .subscribe(new Observer<Long>() { @Override public void onCompleted() { log.d ("completed"); } @Override public void onError(Throwable e) { log.e("error"); } @Override public void onNext(Long number) { log.d ("hello world"); } });
例如:每隔2秒输出日志“helloworld”。
Observable.interval(2, TimeUnit.SECONDS) .subscribe(new Observer<Long>() { @Override public void onCompleted() { log.d ("completed"); } @Override public void onError(Throwable e) { log.e("error"); } @Override public void onNext(Long number) { log.d ("hello world"); } });
八.使用throttleFirst防止按钮重复点击
RxView.clicks(button) .throttleFirst(1, TimeUnit.SECONDS) .subscribe(new Observer<Object>() { @Override public void onCompleted() { log.d ("completed"); } @Override public void onError(Throwable e) { log.e("error"); } @Override public void onNext(Object o) { log.d("button clicked"); } });九.使用schedulePeriodically做轮询请求
Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(final Subscriber<? super String> observer) { Schedulers.newThread().createWorker() .schedulePeriodically(new Action0() { @Override public void call() { observer.onNext(doNetworkCallAndGetStringResult()); } }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS); } }).subscribe(new Action1<String>() { @Override public void call(String s) { log.d("polling….”)); } })十.RxJava进行数组、list的遍历
String[] names = {"Tom", "Lily", "Alisa", "Sheldon", "Bill"}; Observable .from(names) .subscribe(new Action1<String>() { @Override public void call(String name) { log.d(name); } });
十一.解决嵌套回调(callback hell)问题
NetworkService.getToken("username", "password") .flatMap(s -> NetworkService.getMessage(s)) .subscribe(s -> { System.out.println("message: " + s);})
十二.响应式的界面
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);Preference<Boolean> checked = rxPreferences.getBoolean("checked", true);CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test);RxCompoundButton.checkedChanges(checkBox) .subscribe(checked.asAction());
0 0
- 安卓RxJava第四弹之 应用场景
- RxJava应用场景
- 安卓RxJava与Retrofit初级应用
- 安卓RxJava第二弹之 操作符
- 安卓RxJava第三弹之 响应式
- Rxjava一些使用场景应用
- 安卓RxJava学习第一弹
- RxJava + Retrofit 的实际应用场景
- RxJava在Android的应用场景
- 4. RxJava操作符与应用场景
- 安卓activity启动模式的应用场景
- 安卓Activity启动模式特点和应用场景
- 安卓4种启动模式应用场景
- 安卓场景动画
- CTF安卓逆向练习第四弹
- Redis之应用场景
- 安卓第四记
- RxJava的几个操作符和应用场景
- array[0]和[array firstObject]的区别
- 君智咨询:从飞贷看传统企业如何转型移动互联网
- Android相机开发那些坑
- Android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据
- Linux Shell编程入门
- 安卓RxJava第四弹之 应用场景
- Swift3.0学习笔记-Collection Types
- java中关于try、catch、finally中的细节分析
- 解决Maven异常:MojoExecutionException with mvn clean install
- 梦之路
- c# FTP操作类
- 单例模式的七种写法
- 3、图片加载Universal-Image-Loader完全解析--- 基本介绍及使用
- 简单使用ProGuard混淆jar包