Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

yangfeihu/RxjavaProject

Repository files navigation

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.分别定义

//创建Observable Observable observable = Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("Hi"); subscriber.onNext("Aloha"); subscriber.onCompleted(); } });

//创建Observer Obaserver observer = new Observer() { @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"); 1 以上代码执行后将会依次执行onNext("This"),onNext("is"),onNext("RxJava"),onComplete();

String[] strs = {"This", "is", "RxJava"}; Observable observable = Observable.form(strs); 1 2 以上代码执行后将会依次执行onNext("This"),onNext("is"),onNext("RxJava"),onComplete();

3.Observer的变形

能够单独抽出onNext()、onComplete()、onError()来对Observable进行观察。

//onNext() ————参数可定义为其他类型 obserable.subcribe(new Action1(){ public void call(String next){ Log.i(TAG, next); } });

//onError() obserable.subcribe(new Action1(){ public void call(Throwable throwable){

}

});

//onComplete() obserable.subcribe(new Action0(){ public void call(){ "Complete 不存在参数" } });

4.连续定义

Observable.create(new OnSubscribe() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("run onNext()"); subscriber.onCompleted(); } }).subscribe(new Observer() { @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的理解啦,现在网上还有很多大神关于这一部分的讲解,大多都很详细,本文算是交流学习的记录吧。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /