RxJava 在 GitHub 主頁(yè)上的自我介紹是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一個(gè)在 Java VM 上使用可觀測(cè)的序列來(lái)組成異步的、基于事件的程序的庫(kù))。
參考博客:http://gank.io/post/560e15be2dca930e00da1083
http://www.lxweimin.com/p/5e93c9101dc5
github地址:https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
本文針對(duì)的rxjava:1.0.14版本的,在moulde中的build.gradle
的dependencies
中添加如下依賴(lài)
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
基本概念梳理
在Rxjava中,典型的思想就是就是觀察者模式,如果對(duì)其不是其他熟悉的話(huà),建議參考博客。
下面直接先介紹一些基本的概念。
**Observable **:英語(yǔ)翻譯為:可觀察的。在Rxjava中,Observable被用作可觀察的對(duì)象。(可以這么理解,在button.setOnClick(new OnClickListener(){;;;})中,Observable對(duì)象就類(lèi)似于button,即被監(jiān)聽(tīng)的對(duì)象)
Observer:英語(yǔ)翻譯為:觀察者。同翻譯一樣,Observer就是來(lái)充當(dāng)觀察者的角色的,可以接收來(lái)自于Observable發(fā)送的數(shù)據(jù)(類(lèi)似于button.setOnClick(new OnClickListener(){;;;})中的new OnClickListener{;;;},即要實(shí)現(xiàn)的動(dòng)作)
Subscriber:英語(yǔ)翻譯為:訂閱者。Observer的增強(qiáng)版,主要功能同Observer,但相對(duì)Observer,subscriber多了一些方法。如取消訂閱
unsubscribe( )
。一般來(lái)說(shuō),使用的比較多的是Subscriber。建議使用Subscriber來(lái)當(dāng)作觀察者。
最基礎(chǔ)的概念弄清楚了,接下來(lái)的代碼就好理解了。
最簡(jiǎn)單的使用樣例。
都說(shuō)使用Rxjava可以使的代碼的思路變得很清晰,那么首先嘗試使用Rxjava來(lái)解決一些問(wèn)題把。
eg:嘗試將一張圖片顯示在imageView中。
public class NextActivity extends AppCompatActivity {
private ImageView mImageView;
private int drawRes = R.mipmap.ic_launcher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
mImageView = (ImageView) findViewById(R.id.imageview);
Observable observable = Observable.just(drawRes);
//創(chuàng)建Observable對(duì)象,這里使用just創(chuàng)建,傳入圖片的id。
observable.subscribe(subscriber);
//綁定服務(wù),通過(guò)subscribe將observale和subsciber連接起來(lái)。
}
//創(chuàng)建訂閱者,實(shí)現(xiàn)具體邏輯
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
@Override
public void onCompleted() {
//完成之后執(zhí)行的回調(diào)
}
@Override
public void onError(Throwable e) {
//發(fā)生錯(cuò)誤時(shí)執(zhí)行的回調(diào)
}
@Override
public void onNext(Integer o) {
//普通事件,發(fā)出就需要執(zhí)行完畢
mImageView.setImageResource(o);
}
};
}
運(yùn)行上面的代碼后,會(huì)發(fā)現(xiàn)image會(huì)正常的顯示在imageview中。下面對(duì)其中的一些代碼進(jìn)行補(bǔ)充說(shuō)明。
Observable
的創(chuàng)建
Observable 即被觀察者,他決定了什么時(shí)候觸發(fā)事件已經(jīng)觸發(fā)什么樣的事件。下面幾種創(chuàng)建Observable
的方法。
** 1. 利用create
來(lái)創(chuàng)造 **
Observable observable1 = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(123);
subscriber.onNext(1223);
subscriber.onCompleted();
}
});
使用onSubscibe對(duì)象作為參數(shù)傳入。OnSubscribe 的 call() 方法會(huì)自動(dòng)被調(diào)用,事件序列就會(huì)依照設(shè)定依次觸發(fā)(對(duì)于上面的代碼,就是觀察者Subscriber 將會(huì)被調(diào)用兩次 onNext() 和一次 onCompleted())。這樣,由被觀察者調(diào)用了觀察者的回調(diào)方法,就實(shí)現(xiàn)了由被觀察者向觀察者的事件傳遞,即觀察者模式。
** 2. 利用just(T ···)快捷創(chuàng)建**
Observable observable = Observable.just(123,1223);
just會(huì)將參數(shù)依次發(fā)送給subscibe
3. 利用from(T ```)快捷創(chuàng)建
Integer[] ids = {123,1223};
Observable observable1 = Observable.from(ids);
from會(huì)將將傳入的數(shù)據(jù)或者Iterable
拆分成具體對(duì)象后,依次發(fā)送。
上面1、2、3三種創(chuàng)建方法在效果上是等效的。
Observer
的創(chuàng)建
Observer即觀察者,它決定事件觸發(fā)時(shí)候?qū)?huì)有怎么樣的行為。Rxjava創(chuàng)建Observer的方式如下:
Observer<Integer> observer = new Observer <Integer>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
}
};
對(duì)于Observer,Rxjava還提供了功能更加強(qiáng)大的Subscriber
進(jìn)行實(shí)現(xiàn)。通過(guò)Subscriber
可以實(shí)現(xiàn)對(duì)Observer
的擴(kuò)展。
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
@Override
public void onCompleted() {
//完成之后執(zhí)行的回調(diào)
}
@Override
public void onError(Throwable e) {
//發(fā)生錯(cuò)誤時(shí)執(zhí)行的回調(diào)
}
@Override
public void onNext(Integer o) {
//普通事件,發(fā)出就需要執(zhí)行完畢
mImageView.setImageResource(o);
}
@Override
public void onStart() {
super.onStart();
//開(kāi)始之前的準(zhǔn)備工作在這里執(zhí)行(在Subscriber增加的方法)
}
};
其實(shí)兩者的差別并不大,基本的使用方式一樣。下面介紹以下兩者之間細(xì)小的差別。
-
Observer
完全可以用Subscriber
來(lái)代替,事實(shí)上,Observer也是通過(guò)Subscriber來(lái)實(shí)現(xiàn)的,可以將Observer看做是簡(jiǎn)單化的Subscriber。 -
Subscriber
添加在onStart()
方法。。它會(huì)在 subscribe 剛開(kāi)始,而事件還未發(fā)送之前被調(diào)用,可以用于做一些準(zhǔn)備工作,例如數(shù)據(jù)的清零或重置。這是一個(gè)可選方法,默認(rèn)情況下它的實(shí)現(xiàn)為空。
3.unsubscribe()
是Subscriber
實(shí)現(xiàn)的另一個(gè)接口。用于取消訂閱。所以在這個(gè)方法調(diào)用之前,最好需要先使用isUnsubscribed()
先判斷一下?tīng)顟B(tài),避免內(nèi)存泄露。
創(chuàng)建關(guān)聯(lián)
observable.subscribe(subscriber);
// observable.subscribe(observer);
將訂閱者和觀察者關(guān)聯(lián)起來(lái)很簡(jiǎn)單,一行打碼就解決了。
至此,創(chuàng)建一個(gè)簡(jiǎn)單的Rxjava模式的代碼鏈就整理完畢。現(xiàn)在還沒(méi)有看出Rxjava的威力,因?yàn)槲覀兡壳斑€只是簡(jiǎn)單的使用他顯示一張圖片而已。下面先介紹Rxjava更加簡(jiǎn)便的使用,下一篇博客介紹Rxjava真正牛逼的地方。
不完整的回調(diào)的實(shí)現(xiàn)
上面介紹的都是完整的回調(diào)實(shí)現(xiàn),事實(shí)上,Rxjava為我們提供了更加方便快捷的不完整回調(diào),Rxjava會(huì)自動(dòng)創(chuàng)建Subscriber
形如:
Action0 action0 = new Action0() {
@Override
public void call() {
//要執(zhí)行的回調(diào)
}
};
// 自動(dòng)創(chuàng)建 Subscriber ,并使用action0 來(lái)定義 onNext()
observable.subscribe(action0);
Rxjava提供了10個(gè)Action,分別從Action0到Action9,后面的0-9代碼這Action有幾個(gè)參數(shù),如果帶有兩個(gè)參數(shù)的話(huà),可以這么寫(xiě):
Action2<String ,Integer> action2 = new Action2<String, Integer>() {
@Override
public void call(String s, Integer integer) {
//要執(zhí)行的回調(diào)
}
};
完整的實(shí)例:打印字符串?dāng)?shù)組。
String[] names = ...;
Observable.from(names)
.subscribe(new Action1<String>() {
@Override
public void call(String name) {
Log.d(tag, name);
}
});
至此,對(duì)Rxjava應(yīng)該已經(jīng)有了一個(gè)初步的了解,下一篇博客將介紹Rxjava真正強(qiáng)大的地方。