ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:286.20KB ,
资源ID:30617341      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30617341.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(初探RxJava.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

初探RxJava.docx

1、初探RxJava初探RxJava1. RxJava是什么?“a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。 RxJava 在 GitHub 主页上的自我介绍一个扩展的观察者模式一个异步数据流观察者模式是一个观察者(observer或者subscriber)和一个被观察者(observable),观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监

2、听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 观察者模式:Observable发出事件Subscrible订阅事件传统的观察者模式有有明显缺点导致一个被观察者发出的事件如果发生异常后面的事件也就无法正常发出或被观察者捕获: 1. 无法获知事件的终止 2. 没有事件异常处理机制RxJava的观察者模式典型写法是这样的:observable.subscribe(observer);/ 或者:observable.subscribe(subscriber);2.RxJava的基本实现基于以上的概念, RxJava 的基本实现主要有三点: 1) 创建

3、ObserverObserver 即观察者,它决定事件触发的时候将有怎样的行为。 RxJava 中的 Observer 接口的实现方式:Observer observer = new Observer() Override public void onNext(String s) Log.d(tag, Item: + s); Override public void onCompleted() Log.d(tag, Completed!); Override public void onError(Throwable e) Log.d(tag, Error!); ;除了 Observer 接口

4、之外,RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:Subscriber subscriber = new Subscriber() Override public void onNext(String s) Log.d(tag, Item: + s); Override public void onCompleted() Log.d(tag, Completed!); Override public void onError(Throwable e) Lo

5、g.d(tag, Error!); ;2) 创建 ObservableObservable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。 RxJava 使用 create() 方法来创建一个 Observable ,并为它定义事件触发规则:Observable observable = Observable.create(new Observable.OnSubscribe() Override public void call(Subscriber subscriber) subscriber.onNext(Hello); subscriber.onNext(Hi); subscr

6、iber.onNext(Aloha); subscriber.onCompleted(); );可以看到,这里传入了一个 OnSubscribe 对象作为参数。OnSubscribe 会被存储在返回的 Observable 对象中,它的作用相当于一个计划表,当 Observable 被订阅的时候,OnSubscribe 的 call() 方法会自动被调用,事件序列就会依照设定依次触发(对于上面的代码,就是观察者Subscriber 将会被调用三次 onNext() 和一次 onCompleted())。这样,由被观察者调用了观察者的回调方法,就实现了由被观察者向观察者的事件传递,即观察者模式。

7、3) Subscribe (订阅) 创建了 Observable 和 Observer 之后,再用 subscribe() 方法将它们联结起来,整条链子就可以工作了。代码形式很简单:observable.subscribe(observer);/ 或者:observable.subscribe(subscriber);1234这里的subscrible有点怪,有点像observable订阅了subscriber,就像杂志订阅了读者一样。我想是基于作者对于流失API的设计,当然也可以取名字为subscribeBy.4) 场景示例 设有这样一个需求:界面上有一个自定义的视图 imageCollec

8、torView ,它的作用是显示多张图片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数组 File folders 中每个目录下的 png 图片都加载出来并显示在 imageCollectorView 中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在 UI 线程执行。常用的实现方式有多种,我这里贴出其中一种:new Thread() Override public void run() super.run(); for (File folder : folders) File files = fol

9、der.listFiles(); for (File file : files) if (file.getName().endsWith(.png) final Bitmap bitmap = getBitmapFromFile(file); getActivity().runOnUiThread(new Runnable() Override public void run() imageCollectorView.addImage(bitmap); ); .start();而使用RxJava的写法是这样的:Observable.from(folders) .flatMap(new Func

10、1File, Observable() Override public Observable call(File file) return Observable.from(file.listFiles(); ) .filter(new Func1() Override public Boolean call(File file) return file.getName().endsWith(.png); ) .map(new Func1() Override public Bitmap call(File file) return getBitmapFromFile(file); ) .sub

11、scribeOn(Schedulers.io() .observeOn(AndroidSchedulers.mainThread() .subscribe(new Action1() Override public void call(Bitmap bitmap) imageCollectorView.addImage(bitmap); );3. RxJava的异步数据处理指定被观察者生产数据所在的线程指定订阅者接受数据所在的线程强大的数据处理能力先给大家一个实例,假设 /user 接口并不能直接访问,而需要填入一个在线获取的 token ,代码应该怎么写? Callback 方式,可以使用嵌

12、套的 Callback:GET(/token)public void getToken(Callback callback);GET(/user)public void getUser(Query(token) String token, Query(userId) String userId, Callback callback);.getToken(new Callback() Override public void success(String token) getUser(token, userId, new Callback() Override public void succe

13、ss(User user) userView.setUser(user); Override public void failure(RetrofitError error) / Error handling . ; Override public void failure(RetrofitError error) / Error handling . );倒是没有什么性能问题,可是迷之缩进毁一生,据说做过大项目的人应该更懂,而使用 RxJava的话,代码是这样的:GET(/token)public Observable getToken();GET(/user)public Observab

14、le getUser(Query(token) String token, Query(userId) String userId);.getToken() .flatMap(new Func1String, Observable() Override public Observable onNext(String token) return getUser(token, userId); ) .observeOn(AndroidSchedulers.mainThread() .subscribe(new Observer() Override public void onNext(User

15、user) userView.setUser(user); Override public void onCompleted() Override public void onError(Throwable error) / Error handling . );1)数据处理 - 方便对数据进行各种变换操作 - 内置丰富的operators - 自定义operatoreg:数据源返回一个一二三的整数数组,我们想把它转换成一个字符串数组observable.just(1,2,3) .map(new Func1() Override public String call(Integer integ

16、er) return Integer.toString(integer); ) .subscribe(new Action1() Override public void call(String string) System.out.println(string); );A.RxJava的操作符:创建Observable create just from变换Observable map flatMap过滤Observable filter first last合并Observable merge zip聚合函数Observable reduce count 下面我们来看一个flatMap的例子

17、: 首先假设这么一种需求:假设有一个数据结构学生,现在需要打印出一组学生的名字。实现方式很简单:Student students = .;Subscriber subscriber = new Subscriber() Override public void onNext(String name) Log.d(tag, name); .;Observable.from(students) .map(new Func1() Override public String call(Student student) return student.getName(); ) .subscribe(su

18、bscriber);很简单。那么再假设:如果要打印出每个学生所需要修的所有课程的名称呢?(需求的区别在于,每个学生只有一个名字,但却有多个课程。)首先可以这样实现:Student students = .;Subscriber subscriber = new Subscriber() Override public void onNext(Student student) List courses = student.getCourses(); for (int i = 0; i courses.size(); i+) Course course = courses.get(i); Log.

19、d(tag, course.getName(); .;Observable.from(students) .subscribe(subscriber);依然很简单。那么如果我不想在 Subscriber 中使用 for 循环,而是希望 Subscriber 中直接传入单个的 Course 对象呢(这对于代码复用很重要)?用 map() 显然是不行的,因为 map() 是一对一的转化,而我现在的要求是一对多的转化。那怎么才能把一个 Student 转化成多个 Course 呢?这个时候,就需要用 flatMap() 了:Student students = .;Subscriber scribe

20、r = new Subscriber() Override public void onNext(Course course) Log.d(tag, course.getName(); .;Observable.from(students) .flatMap(new Func1Student, Observable() Override public Observable call(Student student) return Observable.from(student.getCourses(); ) .subscribe(subscriber);从上面的代码可以看出, flatMap(

21、) 和 map() 有一个相同点:它也是把传入的参数转化之后返回另一个对象。但需要注意,和 map() 不同的是, flatMap() 中返回的是个 Observable 对象,并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中。 flatMap() 的原理是这样的:1. 使用传入的事件对象创建一个 Observable 对象;2. 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;3. 每一个创建出来的 Observable 发送的事件,都被汇入同一个 Observable ,而这个 Observable 负责将这些事件统一交给

22、 Subscriber 的回调方法。这三个步骤,把事件拆成了两级,通过一组新创建的 Observable 将初始的对象铺平之后通过统一路径分发了下去。而这个铺平就是 flatMap() 所谓的 flat。 flatMap示意图:C.然后就是变换的原理: Observable.subscribe(Subscriber) 的内部实现是这样的(仅核心代码):/ 注意:这不是 subscribe() 的源码,而是将源码中与性能、兼容性、扩展性有关的代码剔除后的核心代码。/ 如果需要看源码,可以去 RxJava 的 GitHub 仓库下载。public Subscription subscribe(Su

23、bscriber subscriber) subscriber.onStart(); onSubscribe.call(subscriber); return subscriber;可以看到,subscriber() 做了3件事: 1.调用 Subscriber.onStart() 。这个方法在前面已经介绍过,是一个可选的准备方法。 2.调用 Observable 中的 OnSubscribe.call(Subscriber) 。在这里,事件发送的逻辑开始运行。从这也可以看出,在 RxJava 中, Observable 并不是在创建的时候就立即开始发送事件,而是在它被订阅的时候,即当 sub

24、scribe() 方法执行的时候。 3.将传入的 Subscriber 作为 Subscription 返回。这是为了方便 unsubscribe().这些变换虽然功能各有不同,但实质上都是针对事件序列的处理和再发送。而在 RxJava 的内部,它们是基于同一个基础的变换方法: lift(Operator)。首先看一下 lift() 的内部实现(仅核心代码):/ 注意:这不是 lift() 的源码,而是将源码中与性能、兼容性、扩展性有关的代码剔除后的核心代码。/ 如果需要看源码,可以去 RxJava 的 GitHub 仓库下载。public Observable lift(Operator o

25、perator) return Observable.create(new OnSubscribe() Override public void call(Subscriber subscriber) Subscriber newSubscriber = operator.call(subscriber); newSubscriber.onStart(); onSubscribe.call(newSubscriber); );这段代码很有意思:它生成了一个新的 Observable 并返回,而且创建新 Observable 所用的参数 OnSubscribe 的回调方法 call() 中的实现

26、竟然看起来和前面讲过的 Observable.subscribe() 一样!然而它们并不一样哟不一样的地方关键就在于第二行 onSubscribe.call(subscriber) 中的 onSubscribe 所指代的对象不同subscribe() 中这句话的 onSubscribe 指的是 Observable 中的 onSubscribe 对象,这个没有问题,但是 lift() 之后的情况就复杂了点。当含有 lift() 时: 1.lift() 创建了一个 Observable 后,加上之前的原始 Observable,已经有两个 Observable 了; 2.而同样地,新 Obser

27、vable 里的新 OnSubscribe 加上之前的原始 Observable 中的原始 OnSubscribe,也就有了两个 OnSubscribe; 3.当用户调用经过 lift() 后的 Observable 的 subscribe() 的时候,使用的是 lift() 所返回的新的 Observable ,于是它所触发的 onSubscribe.call(subscriber),也是用的新 Observable 中的新 OnSubscribe,即在 lift() 中生成的那个 OnSubscribe; 4.而这个新 OnSubscribe 的 call() 方法中的 onSubscri

28、be ,就是指的原始 Observable 中的原始 OnSubscribe ,在这个 call() 方法里,新 OnSubscribe 利用 operator.call(subscriber) 生成了一个新的 Subscriber(Operator 就是在这里,通过自己的 call() 方法将新 Subscriber 和原始 Subscriber 进行关联,并插入自己的变换代码以实现变换),然后利用这个新 Subscriber 向原始 Observable 进行订阅。 这样就实现了 lift() 过程,有点像一种代理机制,通过事件拦截和处理实现事件序列的变换。2)Scheduler:默认情况

29、下RxJava中生产者和订阅者在当前线程下运行,Scheduler就是方便切换生产者和订阅者的线程。Schedulers: - Schdulers.immediate() - Schdulers.newThead() - Sputation() - Schdulers.io() - AndoridSchdulers.mainThead()A.Scheduler 的 API 上代码:Observable.just(1, 2, 3, 4) / IO 线程,由 subscribeOn() 指定 .subscribeOn(Schedulers.io() .observeOn(Schedulers.newThread() .ma

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1