在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

RxJava 使用场景小结

2017-2-7 13:42| 发布者: zhangjf| 查看: 494| 评论: 0

摘要: 原文 http://android.jobbole.com/82241/ 取数据先检查缓存的场景 取数据,首先检查内存是否有缓存 然后检查文件缓存中是否有 最后才从网络中取 前面任何一个条件满足,就不会执行后面的 final Observabl ...
原文 http://android.jobbole.com/82241/ 取数据先检查缓存的场景

取数据,首先检查内存是否有缓存

然后检查文件缓存中是否有

最后才从网络中取

前面任何一个条件满足,就不会执行后面的

  1. final Observable memory = Observable.create(new Observable.OnSubscribe() {
  2. @Override
  3. public void call(Subscriber super String> subscriber) {
  4. if (memoryCache != null) {
  5. subscriber.onNext(memoryCache);
  6. } else {
  7. subscriber.onCompleted();
  8. }
  9. }
  10. });
  11. Observable disk = Observable.create(new Observable.OnSubscribe() {
  12. @Override
  13. public void call(Subscriber super String> subscriber) {
  14. String cachePref = rxPreferences.getString("cache").get();
  15. if (!TextUtils.isEmpty(cachePref)) {
  16. subscriber.onNext(cachePref);
  17. } else {
  18. subscriber.onCompleted();
  19. }
  20. }
  21. });
  22. Observable network = Observable.just("network");
  23. //主要就是靠concat operator来实现
  24. Observable.concat(memory, disk, network)
  25. .first()
  26. .subscribeOn(Schedulers.newThread())
  27. .subscribe(s -> {
  28. memoryCache = "memory";
  29. System.out.println("--------------subscribe: " + s);
  30. });
复制代码

  1. finalObservablememory=Observable.create(newObservable.OnSubscribe(){
  2. @Override
  3. publicvoidcall(SubscribersuperString>subscriber){
  4. if(memoryCache!=null){
  5. subscriber.onNext(memoryCache);
  6. }else{
  7. subscriber.onCompleted();
  8. }
  9. }
  10. });
  11. Observable disk=Observable.create(newObservable.OnSubscribe(){
  12. @Override
  13. publicvoidcall(SubscribersuperString>subscriber){
  14. StringcachePref=rxPreferences.getString("cache").get();
  15. if(!TextUtils.isEmpty(cachePref)){
  16. subscriber.onNext(cachePref);
  17. }else{
  18. subscriber.onCompleted();
  19. }
  20. }
  21. });
  22. Observable network=Observable.just("network");
  23. //主要就是靠concat operator来实现
  24. Observable.concat(memory,disk,network)
  25. .first()
  26. .subscribeOn(Schedulers.newThread())
  27. .subscribe(s->{
  28. memoryCache="memory";
  29. System.out.println("--------------subscribe: "+s);
  30. });
复制代码

界面需要等到多个接口并发取完数据,再更新
  1. //拼接两个Observable的输出,不保证顺序,按照事件产生的顺序发送给订阅者
  2. private void testMerge() {
  3. Observable observable1 = DemoUtils.createObservable1().subscribeOn(Schedulers.newThread());
  4. Observable observable2 = DemoUtils.createObservable2().subscribeOn(Schedulers.newThread());
  5. Observable.merge(observable1, observable2)
  6. .subscribeOn(Schedulers.newThread())
  7. .subscribe(System.out::println);
  8. }
复制代码

  1. //拼接两个Observable的输出,不保证顺序,按照事件产生的顺序发送给订阅者
  2. privatevoidtestMerge(){
  3. Observableobservable1=DemoUtils.createObservable1().subscribeOn(Schedulers.newThread());
  4. Observableobservable2=DemoUtils.createObservable2().subscribeOn(Schedulers.newThread());
  5. Observable.merge(observable1,observable2)
  6. .subscribeOn(Schedulers.newThread())
  7. .subscribe(System.out::println);
  8. }
复制代码

一个接口的请求依赖另一个API请求返回的数据

举个例子,我们经常在需要登陆之后,根据拿到的token去获取消息列表。

这里用RxJava主要解决嵌套回调的问题,有一个专有名词叫 Callback hell

  1. NetworkService.getToken("username", "password")
  2. .flatMap(s -> NetworkService.getMessage(s))
  3. .subscribe(s -> {
  4. System.out.println("message: " + s);
  5. });
复制代码

  1. NetworkService.getToken("username","password")
  2. .flatMap(s->NetworkService.getMessage(s))
  3. .subscribe(s->{
  4. System.out.println("message: "+s);
  5. });
复制代码
界面按钮需要防止连续点击的情况
  1. RxView.clicks(findViewById(R.id.btn_throttle))
  2. .throttleFirst(1, TimeUnit.SECONDS)
  3. .subscribe(aVoid -> {
  4. System.out.println("click");
  5. });
复制代码

  1. RxView.clicks(findViewById(R.id.btn_throttle))
  2. .throttleFirst(1,TimeUnit.SECONDS)
  3. .subscribe(aVoid->{
  4. System.out.println("click");
  5. });
复制代码

响应式的界面

比如勾选了某个checkbox,自动更新对应的preference

  1. SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
  2. RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);
  3. Preference checked = rxPreferences.getBoolean("checked", true);
  4. CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test);
  5. RxCompoundButton.checkedChanges(checkBox)
  6. .subscribe(checked.asAction());
复制代码

  1. SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(this);
  2. RxSharedPreferences rxPreferences=RxSharedPreferences.create(preferences);
  3. Preference checked=rxPreferences.getBoolean("checked",true);
  4. CheckBox checkBox=(CheckBox)findViewById(R.id.cb_test);
  5. RxCompoundButton.checkedChanges(checkBox)
  6. .subscribe(checked.asAction());
复制代码

复杂的数据变换
  1. Observable.just("1", "2", "2", "3", "4", "5")
  2. .map(Integer::parseInt)
  3. .filter(s -> s > 1)
  4. .distinct()
  5. .take(3)
  6. .reduce((integer, integer2) -> integer.intValue() + integer2.intValue())
  7. .subscribe(System.out::println);//9
复制代码

  1. Observable.just("1","2","2","3","4","5")
  2. .map(Integer::parseInt)
  3. .filter(s->s>1)
  4. .distinct()
  5. .take(3)
  6. .reduce((integer,integer2)->integer.intValue()+integer2.intValue())
  7. .subscribe(System.out::println);//9
复制代码


最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 09:52

Copyright 2015-2025 djqfx

返回顶部