rxjava-android 模塊包含RxJava的Android特定的綁定代碼。它給RxJava添加了一些類(lèi),用于幫助在Android應(yīng)用中編寫(xiě)響應(yīng)式(reactive)的組件。
Handler 上調(diào)度 Observable 的調(diào)度器 Scheduler,特別是在UI主線程上。Fragment 和 Activity 的生命周期方法。你可以在 http://search.maven.org 找到用于Maven, Ivy, Gradle和其它構(gòu)建系統(tǒng)的二進(jìn)制文件和依賴(lài)信息。
Maven 示例:
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxandroid</artifactId>
<version>0.23.0</version>
</dependency>
Ivy 示例:
<dependency org="io.reactivex" name="rxandroid" rev="0.23.0" />
當(dāng)前支持的最低API版本(minSdkVersion)是 10 (Android 2.3/Gingerbread)
在Android上,通常處理異步任務(wù)時(shí)你會(huì)在主線程上等待(observing)處理結(jié)果,一般情況下你使用 AsyncTask 達(dá)到這個(gè)目的。使用RxJava,你會(huì)使用 observeOn 操作符聲明你要在主線程等待 Observable 的結(jié)果:
public class ReactiveFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Observable.from("one", "two", "three", "four", "five")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* an Observer */);
}
這個(gè)例子中,Observable在一個(gè)新的線程執(zhí)行,結(jié)果通過(guò) onNext 在主線程發(fā)射。
前面的例子是一個(gè)普遍概念的特殊版本:Android使用一個(gè)叫 Handler 的類(lèi)綁定異步通信到消息循環(huán)。為了在任意線程 觀察 一個(gè)Observable,需要?jiǎng)?chuàng)建一個(gè)與那個(gè)類(lèi)關(guān)聯(lián)的 Handler,然后使用 AndroidSchedulers.handlerThread 調(diào)度器:
new Thread(new Runnable() {
@Override
public void run() {
final Handler handler = new Handler(); // bound to this thread
Observable.from("one", "two", "three", "four", "five")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.handlerThread(handler))
.subscribe(/* an Observer */)
// perform work, ...
}
}, "custom-thread-1").start();
這個(gè)例子中,Observable在一個(gè)新的線程執(zhí)行,結(jié)果通過(guò) onNext 在 custom-thread-1 線程上發(fā)射。(這個(gè)例子不太自然,因?yàn)槟憧梢哉{(diào)用observeOn(Schedulers.currentThread()),但是它說(shuō)清楚了這個(gè)想法。)
在Android上,要在異步操作中訪問(wèn)框架中的對(duì)象有些棘手,那是因?yàn)锳ndoid系統(tǒng)可以決定銷(xiāo)毀(destroy)一個(gè) Activity,例如,當(dāng)一個(gè)后臺(tái)線程還在運(yùn)行的時(shí)候,如果這個(gè)線程嘗試訪問(wèn)一個(gè)已經(jīng)死掉的Activity中的View對(duì)象,會(huì)導(dǎo)致異常退出(Crash)。(這也會(huì)導(dǎo)致內(nèi)存泄露,因?yàn)?Activity 已經(jīng)不可見(jiàn)了,你的后臺(tái)線程還持有它的引用。)
這仍然是在Android上使用RxJava需要關(guān)注的一個(gè)問(wèn)題,但是通過(guò)使用 Subscription和其它Observable操作符,你可以?xún)?yōu)雅地解決這個(gè)問(wèn)題。通常來(lái)說(shuō),當(dāng)你在Activity中訂閱一個(gè)Observable的結(jié)果時(shí)(無(wú)論是直接的還是通過(guò)一個(gè)內(nèi)部類(lèi)),你必須在 onDestroy 里取消訂閱,就像下面例子里展示的那樣:
// MyActivity
private Subscription subscription;
protected void onCreate(Bundle savedInstanceState) {
this.subscription = observable.subscribe(this);
}
...
protected void onDestroy() {
this.subscription.unsubscribe();
super.onDestroy();
}
這樣確保所有指向訂閱者(這個(gè)Activity)的引用盡快釋放,不會(huì)再有通知通過(guò) onNext 發(fā)射給這個(gè)訂閱者。
有一個(gè)問(wèn)題,如果由于屏幕方向的變化導(dǎo)致這個(gè) Activity 被銷(xiāo)毀,在 onCreate 中這個(gè)Observable會(huì)再次啟動(dòng)。你可以使用 cache 或 replay 操作符阻止它發(fā)生,這些操作符保證Observable在 Activity 的生命周期內(nèi)存在(你可以在一個(gè)全局的緩存中保存它,比如放在Fragment中。)你可以使用任何操作符,只要能保證:當(dāng)訂閱者訂閱一個(gè)已經(jīng)在運(yùn)行的Observable時(shí),在它與Activity 解除關(guān)聯(lián)的這段時(shí)間里發(fā)射的數(shù)據(jù)都會(huì)被回放,并且來(lái)自這個(gè)Observable的任何離線通知都會(huì)正常分發(fā)。