本文转载自:

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. kafka监控之KafkaOffsetMonitor

    参考自:http://www.cnblogs.com/sunxucool/p/3904850.html 流行的kafka监控有kafka-web-console.KafkaOffsetMonitor. ...

  2. 完整HttpHelper类

    [代码] [C#]代码 using System; using System.Collections.Generic; using System.Text; using System.Net; usi ...

  3. myecplise 打开报错 Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project 'myf'. Java.lang.NullPointerException

    Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project 'myf'.Java.l ...

  4. sharepreferce支持boolean,string类型

    public class SharePrefersUtils { private static final String name="cogi"; public static bo ...

  5. openlayers加载百度地图

    最近在做openlayers添加百度地图的扩展类,经过轮番的尝试,终于将其接入了,但是发现偏差比较大,有根据百度的坐标进行了比对,将切片原点进行了调整,发现OK了.打开百度地图,可以看出切片的路径如: ...

  6. React Native视频播放(iOS)

    网站链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/learn-react-native-video/ React Nativ ...

  7. CF 118E Bertown roads 桥

    118E Bertown roads 题目:把无向图指定边的方向,使得原图变成有向图,问能否任意两点之间互达 分析:显然如果没有桥的话,存在满足题意的方案.输出答案时任意从一个点出发遍历一遍即可. 求 ...

  8. Table of Contents - TCP/IP

    网络访问层 Ethernet II 网际层 IP IPv4 报文格式 ICMP ICMP 报文分析 ping: 向网络主机发送 ICMP ECHO_REQUEST 包 ARP ARP 过程 arp 命 ...

  9. Socket 两平台互相 通信 .NET

    两个平台互相通信,对方发送数据过来,我方接收数据,对数据进行处理后发送结果给对方,对方进行相应的操作. 首页,我方开启服务监听: Socket socket = new Socket(AddressF ...

  10. 代码研磨 Slim v3 (一)--app->get()&route->add()

    index.php代码如下: $app->get('/forbase', function ($request, $response, $args){ Example\Module\Base:: ...