RxJava 平常使用

本文转载自:

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

一、Scheduler线程切换

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

[html] view plain copy

  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减少频繁的网络请求。避免每输入(删除)一个字就做一次联想

[html] view plain copy

  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个结点
例如:注册的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注册按钮。

[html] view plain copy

  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合并两个数据源。

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

[html] view plain copy

  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中是否存在数据,任何一步一旦发现数据后面的操作都不执行。

[html] view plain copy

  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”,然后结束。

[html] view plain copy

  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”。

[html] view plain copy

  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也能达到同样的效果

[html] view plain copy

  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做轮询请求

[html] view plain copy

  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的遍历

[html] view plain copy

  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)问题

[html] view plain copy

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

十四、响应式的界面

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

[html] view plain copy

    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());
时间: 2024-12-22 06:14:53

RxJava 平常使用的相关文章

MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包含新闻、图片、视频3个大模块,代码封装良好

练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的,代码量还是有的,里面做了大量封装,整体代码整理得很干净,这个我已经尽力整理了.不管是文件(java.xml.资源文件)命名,还是布局设计尽量简单简洁,我对自己写代码的规范还是有信心的- -.代码不会写的很复杂,整个代码结构有很高的统一度,结构也比较简单清晰,方便理解.里面做了大量的封装,包括基类的构建和工具类的封装,再配合Dagger2的使用可以极大地减轻V层(Activity和Fragment)的代码,

RxJava操作符(二) __变换操作

RxJava变换操作符 这周真心比较累,一直都在加班,今天才有点自己的时间来学习新的内容,外包工作苦啊! 上周学习了各种创建操作符,像create,from,Just,Defer-.等等,这周中也工作中也用了不少,有时间也需要总结一下自己在工作中使用的操作符.好了,现在来开始学习一个变换操作符吧,不知道什么意思没关系,一个一个去试错吧. map 官方的翻译是对于Observable发射的每一项数据,都会应用一个函数,执行变换操作,然后返回一个发射这些结果的Observable. 还是举个例子吧,

理解RxJava线程模型

RxJava作为目前一款超火的框架,它便捷的线程切换一直被人们津津乐道,本文从源码的角度,来对RxJava的线程模型做一次深入理解.(注:本文的多处代码都并非原本的RxJava的源码,而是用来说明逻辑的伪代码) 入手体验 RxJava 中切换线程非常简单,例如最常见的异步线程处理,主线程回调的模型,可以很优雅的用如下代码来做处理: Observable.just("magic") .map(str -> doExpensiveWork(str)) .subscribeOn(Sch

一起来造一个RxJava,揭秘RxJava的实现原理

RxJava是一个神奇的框架,用法很简单,但内部实现有点复杂,代码逻辑有点绕.我读源码时,确实有点似懂非懂的感觉.网上关于RxJava源码分析的文章,源码贴了一大堆,代码逻辑绕来绕去的,让人看得云里雾里的.既然用拆轮子的方式来分析源码比较难啃,不如换种方式,以造轮子的方式,将源码中与性能.兼容性.扩展性有关的代码剔除,留下核心代码带大家揭秘RxJava的实现原理. 什么是响应式编程 首先,我们需要明确,RxJava是Reactive Programming在Java中的一种实现.什么是响应式编程

RxJava概叙

给Android开发者的 RxJava 详解:http://gank.io/post/560e15be2dca930e00da1083 响应式编程是一种异步数据流交互的编程范式,而RxJava就是基于事件操作异步数据流在Java上实现的库 核心的理念是将一切都当做数据流来看待,各种变量,用户输入,数据结构,缓存等等 而Rx库提供了高度抽象的函数来操作流,创建.流入流出.过滤.合并.映射等等各种变换 不仅如此,Rx库还使得异步操作,和错误处理变得非常简洁. 使用了RxJava后明显的好处就是 1解

RxJava从入门到放弃---关于RxJava-入门必看

RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式 RxJava 的观察者模式 2. 基本实现 1) 创建 Observer 2) 创建 Observable 3) Subscribe (订阅) 4) 场景示例 a. 打印字符串数组 b. 由 id 取得图片并显示 3. 线程控制 -- Scheduler (一) 1) Scheduler 的 API (一) 2) Scheduler 的原理 (一) 4. 变换 1) API 2) 变

Rxjava+ReTrofit+okHttp深入浅出-终极封装

Rxjava+ReTrofit+okHttp深入浅出-终极封装 背景: 学习Rxjava和retrofit已经很长时间了,功能确实很强大,但是使用起来还是有点复杂,代码的重复性太高,所以决定把基于retrofit和rxjava的处理统一封装起来,实现的功能: 1.Retrofit+Rxjava+okhttp基本使用方法 2.统一处理请求数据格式 3.统一的ProgressDialog和回调Subscriber处理 4.取消http请求 5.预处理http请求 5.返回数据的统一判断 效果: 封装

RxJava开发精要6 – Observables组合

原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转载权,未经允许,不得转载! 译者 : yuxingxin 项目地址 : RxJava-Essentials-CN 上一章中,我们学到如何转换可观测序列.我们也看到了map(),scan(),groupBY(),以及更多有用的函数的实际例子,它们帮助我们操作Observable来创建我们想要的Observabl

RxJava & RxAndroid备忘

"你问我要去向何方,我指着大海的方向" 今天在刷G+的时候看到Dave Smith推荐了一个视频 <Learning RxJava (for Android) by example> 点进去看了一下,原来是位熟悉的"阿三哥",视频封面如下:(没有歧视的意思,不要喷我啊~,为什么感到熟悉?接着往下看) 几乎同时也看到了JetBrains在G+也推荐了篇在Medium上的博文 <RxAndroid And Kotlin (Part 1)> ,然后