老司机的RxJava使用场景总结
2016-11-19 09:43
579 查看
取数据先检查缓存的场景
取数据,首先检查内存是否有缓存然后检查文件缓存中是否有
最后才从网络中取
前面任何一个条件满足,就不会执行后面的
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); });1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[/code]
界面需要等到多个接口并发取完数据,再更新
//拼接两个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); }1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
[/code]
一个接口的请求依赖另一个API请求返回的数据
举个例子,我们经常在需要登陆之后,根据拿到的token去获取消息列表。这里用RxJava主要解决嵌套回调的问题,有一个专有名词叫Callback hell
NetworkService.getToken("username", "password") .flatMap(s -> NetworkService.getMessage(s)) .subscribe(s -> { System.out.println("message: " + s); });1
2
3
4
5
1
2
3
4
5
[/code]
界面按钮需要防止连续点击的情况
RxView.clicks(findViewById(R.id.btn_throttle)) .throttleFirst(1, TimeUnit.SECONDS) .subscribe(aVoid -> { System.out.println("click"); });1
2
3
4
5
1
2
3
4
5
[/code]
响应式的界面
比如勾选了某个checkbox,自动更新对应的preferenceSharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences); Preference<Boolean> checked = rxPreferences.getBoolean("checked", true); CheckBox checkBox = (CheckBox) findViewById(R.id e653 .cb_test); RxCompoundButton.checkedChanges(checkBox) .subscribe(checked.asAction());1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
[/code]
复杂的数据变换
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);//91
2
3
4
5
6
7
1
2
3
4
5
6
7
[/code]
(function () {('pre.prettyprint code').each(function () {
var lines = (this).text().split(′\n′).length;varnumbering = $('').addClass('pre-numbering').hide();
(this).addClass(′has−numbering′).parent().append(numbering);
for (i = 1; i
相关文章推荐
- RxJava学习(二)——RxJava使用场景总结
- Reflection.Emit的使用场景、工具包及示例总结
- Ogre场景编辑器Ogitor的使用总结
- ios frame、bound和center定义及使用场景总结
- Git Bash+EGit在项目中配合使用最常用方法总结(根据场景使用)
- Git Bash+EGit在项目中配合使用最常用方法总结(根据场景使用)
- .NET Remoting学习总结之一:Remoting的使用场景
- Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue使用场景总结
- 对memcached使用的总结和使用场景
- [基础总结]临时场景的使用
- 使用EditText在不同场景下调用软键盘的总结
- 排序算法性能和使用场景总结
- 关于Java的数据结构HashMap,ArrayList的使用总结及使用场景和原理分析
- WCF经典使用场景(互联网、局域网、匿名等)总结和例子
- 排序算法性能和使用场景总结
- ZooKeeper典型使用场景总结
- 排序算法性能与使用场景总结
- 对Memcached使用的总结和使用场景