本文转载自:

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. 解析 iOS 动画原理与实现

    这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式. 什么是动画 动画,顾名思义,就是能“动”的画.人的眼睛对图像有短暂的记忆效应,所以当眼睛看到 ...

  2. Comparison method violates its general contract

    生产环境出现的错误排查,错误log如下 java.lang.IllegalArgumentException: Comparison method violates its general contr ...

  3. UVa OJ 10055

    Problem A Hashmat the brave warrior Input: standard input Output: standard output Hashmat is a brave ...

  4. 阮一峰博客里面css3的display:flex的布局

  5. Android Activity的启动过程

    文章编辑的太长了,请移步我的csdn博客:http://blog.csdn.net/xyh269 Android Activity的启动过程原文链接:http://blog.csdn.net/xyh2 ...

  6. Android 珍藏(二)

    一.如何控制Android  LED等?(设置NotificationManager的一些参数) 代码如下: final int ID_LED=19871103; NotificationManage ...

  7. C#备份,还原数据库

    private void btnBack_Click(object sender, EventArgs e) { string saveAway = @"C:\1.bak"; // ...

  8. WebStrom9 体验nodejs

    之前就有体验过 WebStrom8.0.3 版本,确实不错. 最喜欢的是集成了Terminal 很方便的使用NPM,今天装上发现 Terminal 死活打不上字.什么原因! WebStrom9 在wi ...

  9. vb6.0如何让窗体跟随鼠标运动

    首先将form的boderstyle属性设为0 Dim movesScreen As Boolean Dim mousX As Integer Dim mousY As Integer Dim cur ...

  10. [转]Webservice client timeout

    本文转自:http://social.msdn.microsoft.com/Forums/vstudio/en-us/ed89ae3c-e5f8-401b-bcc7-333579a9f0fe/webs ...