本文转载自:

http://blog.csdn.net/theone10211024/article/details/50435325

一、Scheduler线程切换

这种场景经常会在“后台线程取数据,主线程展示”的模式中看见

  1. Observable.just(1, 2, 3, 4)
  2. .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
  3. .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
  4. .subscribe(new Action1<Integer>() {
  5. @Override
  6. public void call(Integer number) {
  7. Log.d(tag, "number:" + number);
  8. }
  9. });

二、使用debounce做textSearch

用简单的话讲就是当N个结点发生的时间太靠近(即发生的时间差小于设定的值T),debounce就会自动过滤掉前N-1个结点。

比如在做百度地址联想的时候,可以使用debounce减少频繁的网络请求。避免每输入(删除)一个字就做一次联想

  1. RxTextView.textChangeEvents(inputEditText)
  2. .debounce(400, TimeUnit.MILLISECONDS)
  3. .observeOn(AndroidSchedulers.mainThread())
  4. .subscribe(new Observer<TextViewTextChangeEvent>() {
  5. @Override
  6. public void onCompleted() {
  7. log.d("onComplete");
  8. }
  9. @Override
  10. public void onError(Throwable e) {
  11. log.d("Error");
  12. }
  13. @Override
  14. public void onNext(TextViewTextChangeEvent onTextChangeEvent) {
  15. log.d(format("Searching for %s", onTextChangeEvent.text().toString()));
  16. }
  17. });
三、Retrofit结合RxJava做网络请求框架
这里不作详解,具体的介绍可以看扔物线的这篇文章,对RxJava的入门者有很大的启发。其中也讲到了RxJava和Retrofit如何结合来实现更简洁的代码
四、RxJava代替EventBus进行数据传递:RxBus
注意:RxBus并不是一个库,而是一种模式,是使用了RxJava的思想来达到EventBus的数据传递效果。这篇文章把RxBus讲的比较详细。

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


六、使用merge合并两个数据源。

例如一组数据来自网络,一组数据来自文件,需要合并两组数据一起展示。

  1. Observable.merge(getDataFromFile(), getDataFromNet())
  2. .observeOn(AndroidSchedulers.mainThread())
  3. .subscribe(new Subscriber<String>() {
  4. @Override
  5. public void onCompleted() {
  6. log.d("done loading all data");
  7. }
  8. @Override
  9. public void onError(Throwable e) {
  10. log.d("error");
  11. }
  12. @Override
  13. public void onNext(String data) {
  14. log.d("all merged data will pass here one by one!")
  15. });

七、使用concat和first做缓存

依次检查memory、disk和network中是否存在数据,任何一步一旦发现数据后面的操作都不执行。

  1. Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() {
  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<String> disk = Observable.create(new Observable.OnSubscribe<String>() {
  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<String> network = Observable.just("network");
  23. //依次检查memory、disk、network
  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. });

八、使用timer做定时操作。当有“x秒后执行y操作”类似的需求的时候,想到使用timer

例如:2秒后输出日志“hello world”,然后结束。

  1. Observable.timer(2, TimeUnit.SECONDS)
  2. .subscribe(new Observer<Long>() {
  3. @Override
  4. public void onCompleted() {
  5. log.d ("completed");
  6. }
  7. @Override
  8. public void onError(Throwable e) {
  9. log.e("error");
  10. }
  11. @Override
  12. public void onNext(Long number) {
  13. log.d ("hello world");
  14. }
  15. });

九、使用interval做周期性操作。当有“每隔xx秒后执行yy操作”类似的需求的时候,想到使用interval

例如:每隔2秒输出日志“helloworld”。

  1. Observable.interval(2, TimeUnit.SECONDS)
  2. .subscribe(new Observer<Long>() {
  3. @Override
  4. public void onCompleted() {
  5. log.d ("completed");
  6. }
  7. @Override
  8. public void onError(Throwable e) {
  9. log.e("error");
  10. }
  11. @Override
  12. public void onNext(Long number) {
  13. log.d ("hello world");
  14. }
  15. });

十、使用throttleFirst防止按钮重复点击

ps:debounce也能达到同样的效果

  1. RxView.clicks(button)
  2. .throttleFirst(1, TimeUnit.SECONDS)
  3. .subscribe(new Observer<Object>() {
  4. @Override
  5. public void onCompleted() {
  6. log.d ("completed");
  7. }
  8. @Override
  9. public void onError(Throwable e) {
  10. log.e("error");
  11. }
  12. @Override
  13. public void onNext(Object o) {
  14. log.d("button clicked");
  15. }
  16. });

十一、使用schedulePeriodically做轮询请求

  1. Observable.create(new Observable.OnSubscribe<String>() {
  2. @Override
  3. public void call(final Subscriber<? super String> observer) {
  4. Schedulers.newThread().createWorker()
  5. .schedulePeriodically(new Action0() {
  6. @Override
  7. public void call() {
  8. observer.onNext(doNetworkCallAndGetStringResult());
  9. }
  10. }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS);
  11. }
  12. }).subscribe(new Action1<String>() {
  13. @Override
  14. public void call(String s) {
  15. log.d("polling….”));
  16. }
  17. })

十二、RxJava进行数组、list的遍历

  1. String[] names = {"Tom", "Lily", "Alisa", "Sheldon", "Bill"};
  2. Observable
  3. .from(names)
  4. .subscribe(new Action1<String>() {
  5. @Override
  6. public void call(String name) {
  7. log.d(name);
  8. }
  9. });


十三、解决嵌套回调(callback hell)问题

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

十四、响应式的界面

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

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

RxJava 平常使用的更多相关文章

  1. RxJava学习入门

    RxJava是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-bas ...

  2. Android中使用反应式编程RxJava

    GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...

  3. MVP+Dagger2+Rxjava+Retrofit+GreenDao 小应用,包含新闻、图片、视频3个大模块,代码整洁干练

    练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的,代码量还是有的,里面做了大量封装,整体代码整理得很干净,这个我已经尽力整理了.不管是文件(Java.xml. ...

  4. android打飞机游戏、MVP句子迷App、悬浮窗、RxJava+Retrofit、加载动画、定制计划App等源码

    Android精选源码 微信打飞机 android进度设置加载效果源码 Android新手引导库EasyGuide MVP-好看又好用的句子迷客户端 XFloatView 一个简易的悬浮窗实现方案 a ...

  5. Android性能优化之利用Rxlifecycle解决RxJava内存泄漏

    前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...

  6. Android消息传递之基于RxJava实现一个EventBus - RxBus

    前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...

  7. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  8. Android MVP+Retrofit+RxJava实践小结

    关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...

  9. 【腾讯Bugly干货分享】基于RxJava的一种MVP实现

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...

随机推荐

  1. ApplePay高调入华,教你在app里上线ApplePay

      ApplePay在中国上线后,就有许多线上app前后脚加入了对其的接入支持,个人比较喜欢的ENJOY也抢在首批接入了ApplePay应用内支付.本文将分享作者的接入经验. ApplePay是苹果公 ...

  2. Socket 之 原理与编程基础

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...

  3. Code Jam 2008 APAC local onsites Problem C. Millionaire —— 概率DP

    题意: 你有X元钱,进行M轮赌博游戏.每一轮可以将所持的任意一部分钱作为赌注(赌注为0元表示这一轮不押),赌注可以是小数的,不是一定要整数.每一轮 赢的概率为P,赢了赌注翻倍,输了赌注就没了.如果你最 ...

  4. Clairewd’s message

    Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...

  5. java适配器模式随笔记

    今天学习了一下java中的适配器模式,在这里做个记录,方便以后查看 什么是适配器,适配就是连接源到目标的中间件,简单的例子就是我们的港水货手机充电器是大三角,我们想要在大陆正常使用我们需要一个转接充电 ...

  6. [JavaEE] WEB-INF有关的目录路径总结

    1.资源文件只能放在WebContent下面,如 CSS,JS,image等.放在WEB-INF下引用不了. 2.页面放在WEB-INF目录下面,这样可以限制访问,提高安全性.如JSP,html 3. ...

  7. CSS3: border-radius边框圆角详解

    border-radius 基本语法: border-radius : none | <length>{1,4} [/ <length>{1,4} ]? 取值范围: <l ...

  8. 重构3-Pull Up Method(方法上移)

    上移方法(Pull Up Method)重构是将方法向继承链上层迁移的过程.用于一个方法被多个实现者使用时 public abstract class Vehicle { // other metho ...

  9. 前端开发调试工具控制台之console命令详解

    控制台(Console)是Firebug的第一个面板,也是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 一.显示信息的命令 Firebug内置一个console对象,提供5种方法,用来显示 ...

  10. Oracle基础<5>--触发器

    一.触发器 触发器是当特定事件出现时自动执行的代码块.比如,每次对员工表进行增删改的操作时,向日志表中添加一条记录.触发器和存储过程是由区别的:触发器是根据某些条件自动执行的,存储过程是手动条用的. ...