title: RxJava(新手推薦一)
date: 2016-11-27 13:03:46
tags:
好久沒更新了凛捏,這段時間一直在翻譯一篇google官方關(guān)于Bitmap的文檔旨袒,浪費(fèi)了點時間仗扬。所以今天周末來公司給大家更新一篇關(guān)于RxJava的文章,希望對剛剛開始了解這塊的朋友有點幫助卓鹿。
關(guān)于RxJava的文章太多了房揭,剛開始看的時候真的是各種不理解箭阶,這到底有啥用啊。RxJava谚殊?函數(shù)響應(yīng)式編程丧鸯?各種疑問?別急嫩絮,讓我以一個小弱雞的視角給你講解丛肢。
首先說到RxJava围肥,就不得不說一種設(shè)計模式,觀察者模式蜂怎。關(guān)于觀察者模式穆刻,如果你還不是很懂,那么我的這篇文章你說不定會喜歡-->觀察者模式杠步。
好了氢伟,現(xiàn)在假設(shè)你懂了。
RxJava中主要包含兩部分(Observer和Observable)幽歼。
Observer: 觀察者朵锣,通常我們使用比較多的是(Subscribe,可以看成就是Observer)甸私。
Observable: 被觀察者(也可以看做Subject)猪勇。
記得當(dāng)時就因為employer(雇主),employee(職工)糾結(jié)了好久颠蕴。不要在意這個泣刹,不要讓一個本來很簡單的問題被英文繞的晦澀難懂。
當(dāng)Observable(Subject)的內(nèi)容發(fā)生變化時犀被,通知Observer執(zhí)行相應(yīng)的動作椅您。
原理很簡單,我們先來看看怎么用吧寡键。
一.如何引入RxJava
Gradle引入方式如下(x,y,z為相應(yīng)的版本):
compile 'io.reactivex:rxjava:x.y.z'
Maven引入:
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxjava</artifactId>
<version>x.y.z</version>
</dependency>
在例子中掀泳,我用的開發(fā)環(huán)境是Android Studio,所以我選擇第一種方式西轩,我引入的是(io.reactivex:rxjava:1.0.14)员舵。
二.基本使用
1.創(chuàng)建Observable(被觀察者)
Observable<String> observable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello world");
}
});
2.創(chuàng)建Subscribe(觀察者)
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
System.out.println(s);
}
};
3.完成訂閱動作
observable.subscribe(subscriber);(不要糾結(jié)為什么是observable訂閱subscriber,按字面意思應(yīng)該是subscriber訂閱observable才對)藕畔。
好了马僻,一個最基本的RxJava的使用過程寫完了。
讓我們看看運(yùn)行結(jié)果:
仔細(xì)看上面的代碼注服,我們的目的是在被觀察者中傳出一個字符串韭邓,然后在訂閱者subscriber中將該字符串打印出來。
那我們的代碼有沒有什么問題溶弟?
我們的需求是在訂閱者中打印出該字符串而已女淑,也就是我們只需要響應(yīng)onNext就可以,但是按照現(xiàn)在這種寫法辜御,我們需要重寫onNext鸭你,onCompleted以及onError,有點麻煩「ぞ蓿可不可以只需要寫一個方法阁谆?
當(dāng)然可以。于是就有了下面這種寫法瓣窄。
Action1<String> onNextAction = new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
};
隨后笛厦,實現(xiàn)訂閱動作。
observable.subscribe(onNextAction);
有疑問嗎俺夕?
這個Action1又是什么鬼裳凸?和Subscriber又是什么關(guān)系?別急劝贸,待我慢慢道來姨谷。看圖映九。
由圖可以看出梦湘,Subscriber中的每一步可以分別對應(yīng)一個Action1。我們只需要實現(xiàn)我們想要的動作件甥,然后訂閱就可以捌议。
如果我們想實現(xiàn)onNext,onError以及onCompleted引有。我們可以創(chuàng)建三個Action1對象瓣颅,然后在完成訂閱動作即可。
observable.subscribe(onNextAction,onErrAction,onCompleteAction)譬正。
訂閱者是簡化了宫补,但是我們的被觀察者Observable有沒有簡單的寫法呢?
當(dāng)然有曾我,我們可以雨露均沾的粉怕。
Observable<String> observable = Observable.just("Hello world");
Action1<String> onNextAction = new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
};
observable.subscribe(onNextAction);
那么,兩種創(chuàng)建Observable的方式有什么區(qū)別嗎抒巢?(先知道我們被觀察者Obervable已知的有兩種創(chuàng)建方式贫贝,區(qū)別我會在以后的文章中寫。一篇寫的話太長了虐秦,RxJava分為3平酿,4部分寫完)。
現(xiàn)在與以前相比悦陋,寫法上簡單太多,那么有沒有更簡單的寫法呢筑辨?
Observable.just("Hello world").subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
這一步與以上相比俺驶,省去了好多臨時變量的創(chuàng)建,比如observable,顯得結(jié)構(gòu)更為簡潔暮现。那么有沒有更為簡單的寫法呢还绘?畢竟知足很難。是時候Lambda表達(dá)式登場了栖袋,如果你還不會這個表達(dá)式的寫法拍顷,那么完全可以跳過。這部分只是為了表現(xiàn)出函數(shù)響應(yīng)式編程的魅力塘幅。
Observable.just("Hello world").subscribe(
s -> System.out.println(s));
如果需求要變昔案,我們在Subscriber中要對傳出的數(shù)據(jù)進(jìn)行更改,那么怎么做呢电媳?
你可能會說踏揣,這還不簡單。我瞇著眼睛一看就知道有兩種匾乓。
(1)
Observable.just("Hello world str").subscribe(
s -> System.out.println(s));
(2)
Observable.just("Hello world").subscribe(
s -> System.out.println(s + "str"));
觀察實現(xiàn)(1)與實現(xiàn)(2)捞稿。
我們Observable將數(shù)據(jù)傳出時并不知道要做什么自定義的東西,所以方案(1)并不好拼缝。那么方式(2)呢娱局?
我們在訂閱者(Subscriber)中對實現(xiàn)進(jìn)行了更改,這是不合理的咧七,因為Subscriber是被動響應(yīng)的衰齐,為了結(jié)構(gòu)上的簡單,我們并不希望在訂閱者(Subscriber)中做太多東西猪叙。要是能在Observable和Subscriber中間做一些處理就好了娇斩。可以嗎穴翩?來看下RxJava中的Operators犬第。
Operators使用
Observable.just("Hello world").map(new Func1<String, Object>() {
@Override
public Object call(String s) {
return s+"str";
}
}).subscribe(s -> System.out.println(s));
對Func1使用Lambda的寫法如下:
Observable.just("Hello world")
.map(s -> s+"str")
.subscribe(s -> System.out.println(s));
可以看出我們在將事件傳出(just)與訂閱(subscribe)中間進(jìn)行了一些處理。
處理又能怎么樣芒帕?與之前的兩種方式也沒啥區(qū)別啊歉嗓。這么想就是你的不對了,如果我們在中間的處理過程很多背蟆,類似于中間商層層剝皮呢鉴分?按照以前的寫法是不是就比較混亂,在一個里面處理了太多事情〈颍現(xiàn)在RxJava有了Operators志珍,我們就可以這么干。
Observable.just("Hello world")
.map(s -> s+"str")
.map(s -> s + "i")
.map(s -> s + "love")
.map(s -> s + "you")
.subscribe(s -> System.out.println(s));
心動嗎垛叨?當(dāng)我看到還可以這么用的時候伦糯,就差起立了。真幸福。我在中間想處理多少步就處理多少步敛纲。
RxJava的入門基本上完了喂击,那么學(xué)這些到底有什么用?來開始畫餅淤翔。
到底我們實際項目中翰绊,或者具體Android開發(fā)情境中到底該怎么用?
Observable與Subscriber的使用可以讓好多情況下的條理變得更加清晰直觀旁壮,比如Observable獲取網(wǎng)絡(luò)數(shù)據(jù)监嗜,在Subscriber中我們可以將數(shù)據(jù)顯示在UI上。原先我們用Thread+handler所做的一切寡具,現(xiàn)在都可以用RxJava結(jié)合其他一些開源組件秤茅,比如retrofit。