RxJava使用场景小结
来源:互联网 发布:node w3cschool 编辑:程序博客网 时间:2024/05/22 10:40
取数据先检查缓存的场景
取数据,首先检查内存是否有缓存
然后检查文件缓存中是否有
最后才从网络中取
前面任何一个条件满足,就不会执行后面的
final 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");//主要就是靠concat operator来实现Observable.concat(memory, disk, network).first().subscribeOn(Schedulers.newThread()).subscribe(s -> { memoryCache = "memory"; System.out.println("--------------subscribe: " + s);});
界面需要等到多个接口并发取完数据,再更新
//拼接两个Observable的输出,不保证顺序,按照事件产生的顺序发送给订阅者private void testMerge() { Observable<String> observable1 = DemoUtils.createObservable1().subscribeOn(Schedulers.newThread()); Observable<String> observable2 = DemoUtils.createObservable2().subscribeOn(Schedulers.newThread()); Observable.merge(observable1, observable2) .subscribeOn(Schedulers.newThread()) .subscribe(System.out::println);}
一个接口的请求依赖另一个API请求返回的数据
举个例子,我们经常在需要登陆之后,根据拿到的token去获取消息列表。
这里用RxJava主要解决嵌套回调的问题,有一个专有名词叫Callback hell
NetworkService.getToken("username", "password") .flatMap(s -> NetworkService.getMessage(s)) .subscribe(s -> { System.out.println("message: " + s); });
界面按钮需要防止连续点击的情况RxView.clicks(findViewById(R.id.btn_throttle)) .throttleFirst(1, TimeUnit.SECONDS) .subscribe(aVoid -> { System.out.println("click"); });
响应式的界面
比如勾选了某个checkbox,自动更新对应的preference
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());
复杂的数据变换Observable.just("1", "2", "2", "3", "4", "5") .map(Integer::parseInt) .filter(s -> s > 1) .distinct() .take(3) .reduce((integer, integer2) -> integer.intValue() + integer2.intValue()) .subscribe(System.out::println);//9
0 0
- RxJava使用场景小结
- RxJava使用场景小结
- RxJava使用场景小结
- RxJava使用场景小结
- RxJava 使用场景小结
- RxJava使用场景小结
- RxJava使用场景小结
- RxJava使用场景小结
- RxJava使用场景小结
- RxJava使用场景小结
- RxJava使用场景小结
- RxJava使用场景小结
- Android RxJava使用场景小结
- RxJava适用场景小结
- 可能是东半球最全的RxJava使用场景小结
- 可能是东半球最全的RxJava使用场景小结
- 可能是东半球最全的RxJava使用场景小结
- 可能是东半球最全的RxJava使用场景小结
- UIViewController view的加载情况,以及frame怎样改变问题
- Android Fragment 基本介绍
- Java操作oracle中的事物回滚
- 开始写技术博客
- c# 读取excle表
- RxJava使用场景小结
- Raspberry Pi Blink(Python RPi.GPIO)
- php极速入门
- 使用new和vector实现一维和二维数组
- 21、Oracle中drop user和drop user cascade的区别?
- Mybatis实现Mapper动态代理方式
- 十五个数的顺序排列
- php极速入门2
- 报错storage size of ‘act’ isn’t known当使用std=c99编译struct sigaction