Contenu connexe Similaire à 使用 RxJava 让数据流动 (Let data streaming using rxjava) (20) 使用 RxJava 让数据流动 (Let data streaming using rxjava)11. 什什么是 RxJava - 概念
• Reactive eXtensions (ReactiveX) for the JVM
• 异步编程、事件驱动(数据流)编程
• ReactiveX 结合了了观察者模式、迭代器器模式和函数式编程的优点
12. 什什么是 RxJava - 组成
• 做三件事
• 数据/事件的创建
create, from, just
• 组合、转换数据流
operators (map, flatMap, filter, merge, combineLatest, etc.)
• 监听处理理结果
subscribe
13. 什什么是 RxJava - 特点
• 屏蔽实现细节
不不需要关⼼心是在同⼀一线程还是多个线程,是否⽤用了了线程池,要执⾏行行多久,等等。
只需要知道,未来的某个时间,它会在某个线程更更新数据给你。
14. 什什么是 RxJava - 特点
• 统⼀一的数据更更新、异常处理理、取消、结束机制
onNext, onError, onComplete
链条中部发⽣生的错误会⼀一直传递到监听者
在链条的任何位置,你都可以处理理异常 (onErrorReturn,
onErrorResumeNext, retry)
• ⽅方便便的 Operators
debounce, timeout, groupBy, etc.
16. RxJava API - Overview
• Observable<T>: create, from, just
OnSubscribe<T>
• Observer<T>: onNext, onError, onComplete
• Subscriber<T>: implements Observer<T>, Subscription
Subscription
Operator<R, T>: Lifting Subscriber<T> to Subscriber<R>
http://reactivex.io/documentation/operators.html
• Subject<T>: Bridge between Observable<T> and Subscriber<T>
• Scheduler: Source of concurrency for observables.
(subscribe | observe) On
19. RxJava API - Operator
Source: http://reactivex.io/documentation/observable.html
20. RxJava API - Functional API
• Unfold: T -> Observable<T>
just, range, timer, interval, create, never, empty, error
• Map: Observable<T1> -> Observable<T2>
map, filter
• Fold (or reduce): Observable<T> -> T
reduce, toList
21. RxJava API - Cold vs Hot Observable
• 数据的产⽣生是依赖于 Observable 类型的
• “cold” Observable,其数据源是绑定在 Observable ⽣生命周期中的
数据源在有观察者时创建,观察者可以保证收到所有数据
• “hot” Observable,其数据源是脱离于 Observable 的
每次创建⼀一个新的 Observable,可能是从数据流的中间才开始观察
可⽤用于共享⼀一个数据源
• Subject always “hot”
24. Rx Powered Libs
• RxLifecycle - Lifecycle handling APIs for Android apps using RxJava
• RxBinding - RxJava binding APIs for Android's UI widgets.
• SqlBrite - A lightweight wrapper around SQLiteOpenHelper and ContentResolver which introduces reactive stream semantics to queries.
• Android-ReactiveLocation - Library that wraps location play services API boilerplate with a reactive friendly API.
• rx-preferences - Reactive SharedPreferences for Android
• RxFit - Reactive Fitness API Library for Android
• RxWear - Reactive Wearable API Library for Android
• RxPermissions - Android runtime permissions powered by RxJava
• RxNotification - Easy way to register, remove and manage notifications using RxJava
• RxClipboard - RxJava binding APIs for Android clipboard.
Source: https://github.com/ReactiveX/RxAndroid/wiki
27. ⼀一些坑 - 基本概念和⽤用法
• 理理解 RxJava 最关键的部分,就是理理解 RxJava 的流,包括流的源头
(Observable)、操作 (Operation)、和终点 (Subscription)。
• 流的初始化函数,只有在被订阅时,才会执⾏行行。流的操作,只有在有
数据传递过来时,才会进⾏行行,这⼀一切都是异步的。
(错误的理理解了了代码执⾏行行时机)
28. ⼀一些坑 - Unsubscribe !
• cold observable 还好。如果是 hot observable,这会导致 memory leak,多次
注册等问题
• 好习惯是使⽤用⼀一个 SubscriptionList 将所有 subscription 都包装到⼀一起,
onDestroy 时⼀一次性 unsubscribe(管理理好流的⽣生命周期)
• SubscriptionList 在 unsubscribe 之后 add 进来的 Subscription ,都会执⾏行行
unsubscribe 。 所以,unsubscribe 之后,如果还想重新使⽤用这个list,需要new
⼀一个新的。
• 技巧:Subscriptions.create(Action),可以创建⼀一个在 unsubscribe 时执⾏行行的
Action。可以将某些API的注册、反注册写到⼀一块,让代码易易读
29. ⼀一些坑 - 操作符 (Operators)
• 在没有弄弄清楚 Operator 的意思和影响前,不不要使⽤用它。
• ⼩小⼼心那些不不会 complete 的 observable 和收集类型的操作符
⽐比如reduce, toList, scan 等,必须等到Observable complete,才会返回
结果。
如果发现你的操作链条完全不不返回结果,看看是不不是在不不会 complete 的
observable 上使⽤用了了收集型的操作符
• distinctUntilChanged
可以过滤掉相同的元素。但注意不不要复⽤用数据,否则可能造成同⼀一个实例例
虽然被修改,但是由于是同⼀一个引⽤用,所以都被过滤掉了了。
30. ⼀一些坑 - 线程、插件和其他
• RxJava ⼤大量量使⽤用异步。⽽而⼤大部分操作并不不会引⼊入线程。
数据源在哪个线程,就在那个线程执⾏行行。
⾮非特殊指定,OnSubscribe 在 subscribe 的线程执⾏行行。
• 尽量量使⽤用纯函数式编程(不不引⼊入 side effects,所有的数据,都只会通过函数的参数和返
回值来传递),这样的函数,⼏几乎可以随意的切换线程和并发。
• 如果有side effects,⼀一定要注意线程。⼤大部分的多线程由数据源引起。但也有部分线程
是因为某些操作符,⽐比如 timeout, debounce 等,所以,使⽤用⼀一个操作符前,也需要通
过⽂文档了了解它的⼯工作线程。
• Subject 不不是线程安全的,确保 onNext 都在⼀一个线程调⽤用。如需多线程,使⽤用
toSerialized() 将 subject 转变成线程安全的。