RxJava使用简介
来源:互联网 发布:和樱井知香一样能喷的 编辑:程序博客网 时间:2024/05/07 12:30
- RxJava简介
- 基本组成
- 基本使用
- 分别定义
- Observable的变形
- Observer的变形
- 连续定义
- Scheduler
- 线程分类
- 线程使用
- Scheduler原理
- Scheduler使用变换
- RxJava简介
RxJava简介
RxJava可以看做是观察者模式的升级,使用RxJava的目的主要是为了数据异步处理。相比于Handler来说,优点就在于简洁,逻辑上非常简单明了。
基本组成
由Observable、Observer、Subscribe完成基本功能,Observable(被观察者)、Observer/Su(观察者)、Subscribe(订阅)这三部分完成观察模式。
Observable作为被观察者,在整个过程中担任消息通知的工作,可以指定自己本身的逻辑方法,并且通过onNext()、onComplete()将通知发出。
subscribe作为订阅,作为链条连接Observable与Observer,完成观察者与被观察者之间的联系。
Observer作为观察者,当收到通知后,能够在onNext()、onComplete()、onError()中处理通知内容。RxJava同时提供了Subscribe接口,该接口与Observer接口基本一致,另加了onStart():在通知发送前执行预准备代码;unsubscribe()方法:用于取消订阅,应及时在不需要时调用,避免内存泄漏。
基本使用
1.分别定义
//创建ObservableObservable observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("Hi"); subscriber.onNext("Aloha"); subscriber.onCompleted(); }});//创建ObserverObaserver observer = new Observer<String>() { @Override public void onNext(String text) { Log.i("TAG", text); } @Override public void onCompleted() { //TODO 完成内容 } @Override public void onError(Throwable e) { Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show(); }};//订阅observable.subcribe(observer);
2.Observable的变形
Observable observable = Observable.just("This", "is", "RxJava");
以上代码执行后将会**依次执行**onNext(“This”),onNext(“is”),onNext(“RxJava”),onComplete();
String[] strs = {"This", "is", "RxJava"};Observable observable = Observable.form(strs);
以上代码执行后将会**依次执行**onNext(“This”),onNext(“is”),onNext(“RxJava”),onComplete();
3.Observer的变形
能够单独抽出onNext()、onComplete()、onError()来对Observable进行观察。
//onNext() ————参数可定义为其他类型obserable.subcribe(new Action1<String>(){ public void call(String next){ Log.i(TAG, next); }});//onError()obserable.subcribe(new Action1<Throwable>(){ public void call(Throwable throwable){ }});//onComplete()obserable.subcribe(new Action0(){ public void call(){ "Complete 不存在参数" }});
4.连续定义
Observable.create(new OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("run onNext()"); subscriber.onCompleted(); }}).subscribe(new Observer<String>() { @Override public void onNext(String text) { Log.i("TAG", text); } @Override public void onCompleted() { } @Override public void onError(Throwable e) { Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show(); }});
Scheduler
了解以上的内容后,RxJava的基本使用已经没啥问题了,然而,正如之前所说,我们大多数使用RxJava的目的是达到不同线程之间的通信并且让这一过程的逻辑尽量简洁。
而上面所介绍的所有动作都是在同一线程中完成的。也就是说在默认时,Observable中方法、Observer中方法都会在Retrofit创建的线程中运行。而在这一情况下,我们使用RxJava就没有意义了。这时就需要使用到Scheduler来进行线程控制。
线程分类
Schedulers.immdiate:当前线程(默认值)Schedulers.io:适合IO操作(文件读写、网络数据交互)Schdulers.newThread:开启新线程Schdulers.computation:计算线程(常用于图像计算)AndroidSchdulers.mainThread:Android中特用,主线程(UI线程)
线程使用
sbuscribeOn():被观察者动作线程
observerOn():观察者处理线程
Scheduler原理
之前看到扔物线大神说这里是精华部分,嗯,反正我是看high了。关于这一部分,我目前实在是没有太多精力完全看明白,所以先不献丑了,等到后期我能够完全理解后,再向大家介绍。
Scheduler使用(变换)
- map()
能够完成对象的转换。将Observable获取的对象通过map()将数据从一种对象装换为另一对象,配合Function1完成这一动作。
Func1<Object1, Obejct2>()Object1:代表参数对象OBejct2:代表返回对象Func1与Action1基本一致,唯一区别就在于Func1存在返回值。
- flatmap()
完成对象转换,并且是将一个对象转换为Observable
' 单调的文字说明是有点绕,用代码来看看 '' 设定: '' Person:包含属性 name(String), age(int), address(Address[]) 包含多个'' 目的:获取所有的朋友所有住址名称' Person[] persons = "......"; Observable.from(persons). flatmap(new Func1<Person, Observable<friend, Address>>(){ public Observable<Address> call(Person person){ return Observable.from(person.getAddress()); } }). subscribe(new Action1<Address>(){ public void call(Address address){ Log.i("TAG", address.getName()); } });
打完收功。是不是很简单,都不用解释。
来来来,你把键盘放下,我好好说话。
那么这个flatmap到底做了啥,我们先来观察一下代码。
目的是要获取每个Person的所有Address
flatmap()首先处理Person对象,从一个person对象中获取Address[],之后将获取到的Address[]通过Observable.from()依次处理,return这个点上,所做的是将Observable依次传递给Observer处理。而Observer将会获取到Address,用来进一步处理。
嗯,解释的很清楚,再不懂就不能怪我。
好好好,先把鼠标线从我脖子上拿开,我再给你画张图。
清晰,明了,给自己点赞。
以上的内容就是目前对RxJava的理解啦,现在网上还有很多大神关于这一部分的讲解,大多都很详细,本文算是交流学习的记录吧。
关于MVP和MVVM嘛,搜索的时候看到的RxJava和Retrofit,实在没忍住就先学习了下RxJava,放心放心,MVP会写的,毕竟离月底还有一段时间。( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)
- RxJava使用简介
- RxJava----简介
- Rxjava 简介
- Rxjava简介
- RXJava 简介
- RxJava简介
- RxJava简介
- Rxjava简介
- RxJava系列1(简介)
- Dagger2+Retrofit2+Rxjava 简介
- RxJava系列1(简介)
- Rxjava简介(一)
- RxJava简介2
- RxJava系列1(简介)
- RxJava的简介
- RxJava之Scheduler简介
- RxJava——简介
- RxJava----使用
- 2016暑假练习——DP
- 泛型小解析
- linux安装pil 20151209
- UML概述及UML模型图的构成和关系
- HDU 2999 Stone Game, Why are you always there?
- RxJava使用简介
- 强引用,软引用,弱引用,虚引用的使用
- Java初级之4基本元素
- 数据结构 并查集 UVA 1160
- 面向对象之抽象与重写
- svn中的revert和update
- 面向对象_this关键字_标准的手机类代码及其测试
- 部署Git 20151209
- java5题库